Laravel-datatables: Suche: Attribut über ID abrufen

Erstellt am 1. Juni 2016  ·  3Kommentare  ·  Quelle: yajra/laravel-datatables

Zusammenfassung des Problems oder der Funktionsanfrage

One-to-Many-Beziehung, die über das Speichern der ID der besitzenden Entität in der Tabelle mit vielen Entitäten geltend gemacht wird. Beispiel: Koordinator verwaltet ein oder mehrere Zentren. Nachdem ich die Spalten über den HTML-Builder festgelegt habe, bearbeite ich die Spalte coodinator_id und wende eine Accessor-Methode an, um den vollständigen Namen des Koordinators abzurufen:

public function getFullNameAttribute()
{
    return $this->first_name . ", " . $this->last_name;
}

Mein Ziel ist es, nur die Zentren, die dem authentifizierten Koordinator gehören, in der Datentabelle anzuzeigen, es sei denn, der authentifizierte Benutzer ist ein Administrator, wie in meinen Abfragen gezeigt.
Wenn ich jedoch den Wert der Koordinatorspalte eingebe, die in der Datentabelle angezeigt wird, heißt es, dass keine übereinstimmenden Datensätze gefunden wurden.

Wie erreiche ich das?

Bitte beschreiben Sie hier Ihr Problem/Ihre Funktionsanfrage.

Code-Snippet des Problems

Falls zutreffend, fügen Sie bitte eine Kopie Ihres Codes bei, der den vermuteten Fehler auslöst. Sie können die Markdown-PHP-Code-Tags verwenden, um Ihre Paste zu formatieren:
<?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';
    }
}

Systemdetails

  • Betriebssystem: OS X El Capitan 10.11.5
  • PHP-Version: 7.0.0
  • Laravel-Version: 5.1.36 (LTS)
  • Laravel-Datentabellen Version : 6.11.5

Grüße,

question

Hilfreichster Kommentar

Ein Trick, den Sie tun können, besteht darin, beide Spalten in js hinzuzufügen, aber sie können weiterhin durchsucht werden:

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

Alle 3 Kommentare

Versuchen Sie, nach dem Namen des Koordinators zu suchen? Wenn dies der Fall ist, können Sie Eager-Loading- oder Join-Abfragen verwenden, damit es funktioniert.

Ich habe versucht, eifrig zu laden, geändert gemäß dem Tutorial auf Ihrer Website. Mein Problem ist jetzt jedoch, dass ich nicht den vollständigen Namen der Koordinatoren speichere, sondern ihren Vor- und Nachnamen getrennt. Was ich aktuell habe:
Anfrage

$centers = Center::query()->with('coordinator')->where('coordinator_id',Auth::user()->userable->id);
            return $this->applyScopes($centers);

Säulen

'first_name' => [
                'data' => 'coordinator.first_name',
                'name' => 'coordinator.first_name',
                            'title' => 'Coordinator',
                            'searchable' => true,
                ],

Bearbeitungsmethode

->editColumn('first_name', function ($user) {
                return Area_Coordinator::find($user->area_coordinator_id)->full_name;
                })

Ich kann jedoch über den Vornamen des Koordinators suchen, da ich nach diesem und dem Nachnamen suchen möchte, gibt es eine Möglichkeit, beide in einer Spalte zu verketten? Oder wenden Sie meine Accessor-Methode an, oder sollte ich nur die Nachnamensspalte in die Datentabelle aufnehmen?

Grüße,

Ein Trick, den Sie tun können, besteht darin, beide Spalten in js hinzuzufügen, aber sie können weiterhin durchsucht werden:

'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;
})
War diese Seite hilfreich?
0 / 5 - 0 Bewertungen