Laravel-datatables: Recherche : récupération de l'attribut via l'identifiant

Créé le 1 juin 2016  ·  3Commentaires  ·  Source: yajra/laravel-datatables

Résumé du problème ou de la demande de fonctionnalité

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.

Extrait de code du problème

Le cas échéant, veuillez inclure une copie de votre code qui déclenche le bogue suspecté. Vous pouvez utiliser les balises de code php markdown pour formater votre pâte :
<?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';
    }
}

Détails du système

  • Système d'exploitation : OS X El Capitan 10.11.5
  • Version PHP : 7.0.0
  • Version Laravel : 5.1.36 (LTS)
  • Laravel-Datatables Version : 6.11.5

Salutations,

question

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 :

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

Tous les 3 commentaires

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;
})
Cette page vous a été utile?
0 / 5 - 0 notes

Questions connexes

techguydev picture techguydev  ·  3Commentaires

ahmadbadpey picture ahmadbadpey  ·  3Commentaires

nasirkhan picture nasirkhan  ·  3Commentaires

t0n1zz picture t0n1zz  ·  3Commentaires

sangnguyenplus picture sangnguyenplus  ·  3Commentaires