Relación uno a muchos afirmada mediante el almacenamiento de la identificación de la entidad propietaria en la tabla de muchas entidades. Por ejemplo: el coordinador gestiona uno o varios centros. Después de configurar las columnas a través del constructor html, edito la columna coodinator_id y aplico un método de acceso para recuperar el nombre completo del coordinador:
public function getFullNameAttribute()
{
return $this->first_name . ", " . $this->last_name;
}
Mi objetivo es permitir que solo los centros que pertenecen al coordinador autenticado se muestren en la tabla de datos a menos que el usuario autenticado sea un administrador como se muestra en mis consultas.
Sin embargo, si ingreso el valor de la columna Coordinador que aparece en la tabla de datos, dice que no se encontraron registros coincidentes.
¿Cómo logro esto?
Describa su problema / solicitud de función aquí.<?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';
}
}
Saludos,
¿Estás intentando buscar el nombre del coordinador? Si ese es el caso, puede usar la carga ansiosa o unirse a las consultas para que funcione.
Probé la carga ansiosa, modificada según el tutorial en su sitio. Sin embargo, ahora mi problema es que no estoy almacenando el nombre completo de los coordinadores, sino su nombre y apellido por separado. Lo que tengo actualmente:
consulta
$centers = Center::query()->with('coordinator')->where('coordinator_id',Auth::user()->userable->id);
return $this->applyScopes($centers);
columnas
'first_name' => [
'data' => 'coordinator.first_name',
'name' => 'coordinator.first_name',
'title' => 'Coordinator',
'searchable' => true,
],
método de edición
->editColumn('first_name', function ($user) {
return Area_Coordinator::find($user->area_coordinator_id)->full_name;
})
Sin embargo, puedo buscar a través del nombre de los coordinadores, ya que quiero buscar por ese y el apellido, ¿hay alguna manera de concatenar ambos en una columna? ¿O más bien, aplicar mi método de acceso, o debería simplemente incluir la columna de apellido en la tabla de datos?
Saludos,
Un truco que puede hacer es agregar ambas columnas en js pero ellas para que aún se puedan buscar:
'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;
})
Comentario más útil
Un truco que puede hacer es agregar ambas columnas en js pero ellas para que aún se puedan buscar: