Laravel-datatables: Búsqueda: Recuperando atributo a través de id

Creado en 1 jun. 2016  ·  3Comentarios  ·  Fuente: yajra/laravel-datatables

Resumen del problema o solicitud de función

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í.

Fragmento de código del problema

Si corresponde, incluya una copia de su código que desencadena el error sospechoso. Puede usar las etiquetas de código php de Markdown para formatear su pegado:
<?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';
    }
}

Detalles del sistema

  • Sistema operativo: OS X El Capitan 10.11.5
  • Versión de PHP: 7.0.0
  • Versión de Laravel: 5.1.36 (LTS)
  • Versión de Laravel-Datatables: 6.11.5

Saludos,

question

Comentario más útil

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;
})

Todos 3 comentarios

¿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;
})
¿Fue útil esta página
0 / 5 - 0 calificaciones