Relation un-à-plusieurs affirmée via le stockage de l'identifiant de l'entité propriétaire dans la table de plusieurs entités. Ex : le coordinateur gère un ou plusieurs centres. Après avoir défini les colonnes via le générateur html, j'édite la colonne coodinator_id et applique une méthode d'accès pour récupérer le nom complet des coordinateurs :
public function getFullNameAttribute()
{
return $this->first_name . ", " . $this->last_name;
}
Mon objectif est d'autoriser uniquement les centres qui appartiennent au coordinateur authentifié à être affichés sur la table de données, à moins que l'utilisateur authentifié ne soit un administrateur, comme indiqué dans mes requêtes.
Cependant, si j'entre la valeur de la colonne Coordinateur qui apparaît sur la table de données, cela indique qu'aucun enregistrement correspondant n'a été trouvé.
Comment puis-je y parvenir ?
Veuillez décrire votre problème/demande de fonctionnalité ici.<?php
namespace App\DataTables;
use Auth;
use App\Center;
use App\Coordinator;
use Yajra\Datatables\Services\DataTable;
class CentersDataTable extends DataTable
{
// protected $printPreview = 'path.to.print.preview.view';
/**
* Display ajax response.
*
* <strong i="13">@return</strong> \Illuminate\Http\JsonResponse
*/
public function ajax()
{
return $this->datatables
->eloquent($this->query())
->editColumn('action', function ($center) {
return '<a href="edit-center/'.$center->id.'" <i class="material-icons sideicons-tables">create</i>';
// <a href="field-technician-delete/'.$user->id.'" <i class="material-icons sideicons-tables">delete</i>
})
->editColumn('coordinator_id', function ($user) {
return Coordinator::find($user->coordinator_id)->full_name;
})
->editColumn('gps_lat', function ($center) {
return $center->gps_location ;
})
->make(true);
}
/**
* Get the query object to be processed by datatables.
*
* <strong i="14">@return</strong> \Illuminate\Database\Query\Builder|\Illuminate\Database\Eloquent\Builder
*/
public function query()
{
if(Auth::user()->hasRole('admin')){
$centers = Center::query();
return $this->applyScopes($centers);
}
else{
$centers = Center::query()->where('coordinator_id',Auth::user()->userable->id);
return $this->applyScopes($centers);
}
}
/**
* Optional method if you want to use html builder.
*
* <strong i="15">@return</strong> \Yajra\Datatables\Html\Builder
*/
public function html()
{
return $this->builder()
->columns([
'id' => ['title' => 'ID'],
'center_name' => ['title' => 'Name'],
'gps_lat' => ['title' => 'Coordinates'],
'contact_no' => ['title' => 'Contact Number'],
'coordinator_id' => [
'title' => 'Coordinator',
'searchable' => true
],
'created_at' => [ 'title' => 'Created'],
'updated_at' => ['title' => 'Updated'],
'action' => [
'data' => 'action',
'name' => 'action',
'render' => null,
'orderable' => false,
'searchable' => false,
'exportable' => false,
'printable' => false
]
])
->parameters([
'dom' => 'Bfrtip',
'buttons' => ['csv', 'excel', 'print','reload'],
]);
}
/**
* Get columns.
*
* <strong i="16">@return</strong> array
*/
private function getColumns()
{
return [
'id',
// add your columns
'created_at',
'updated_at',
];
}
/**
* Get filename for export.
*
* <strong i="17">@return</strong> string
*/
protected function filename()
{
return 'centers';
}
}
Salutations,
Essayez-vous de rechercher le nom du coordinateur ? Si tel est le cas, vous pouvez utiliser un chargement rapide ou joindre des requêtes pour que cela fonctionne.
J'ai essayé le chargement rapide, modifié selon le tutoriel sur votre site. Cependant, maintenant, mon problème est que je ne stocke pas le nom complet des coordinateurs, mais plutôt leur prénom et leur nom séparément. Ce que j'ai actuellement :
mettre en doute
$centers = Center::query()->with('coordinator')->where('coordinator_id',Auth::user()->userable->id);
return $this->applyScopes($centers);
Colonnes
'first_name' => [
'data' => 'coordinator.first_name',
'name' => 'coordinator.first_name',
'title' => 'Coordinator',
'searchable' => true,
],
méthode d'édition
->editColumn('first_name', function ($user) {
return Area_Coordinator::find($user->area_coordinator_id)->full_name;
})
Je peux cependant effectuer une recherche via le prénom des coordinateurs, car je souhaite effectuer une recherche par ce nom et le nom de famille, existe-t-il un moyen de concaténer les deux dans une seule colonne ? Ou plutôt, appliquer ma méthode d'accesseur, ou dois-je simplement inclure la colonne du nom de famille dans la table de données ?
Salutations,
Une astuce que vous pouvez faire est d'ajouter les deux colonnes sur js mais elles afin qu'elles puissent toujours être recherchées :
'last_name' => [
'data' => 'coordinator.last_name',
'visible' => false,
'name' => 'coordinator.last_name',
],
'coordinator' => [
'data' => 'coordinator',
'name' => 'coordinator.first_name',
],
->addColumn('coordinator', function ($user) {
return Area_Coordinator::find($user->area_coordinator_id)->full_name;
})
Commentaire le plus utile
Une astuce que vous pouvez faire est d'ajouter les deux colonnes sur js mais elles afin qu'elles puissent toujours être recherchées :