Laravel-datatables: La fonction de recherche rapide Yajra Datatables ne recherche pas

Créé le 7 juin 2016  ·  17Commentaires  ·  Source: yajra/laravel-datatables

Bonne journée!

J'ai un problème avec la recherche d'enregistrements dans mes tables de données. Seule la colonne tracking_id peut être recherchée. J'ai besoin que toutes les colonnes soient recherchées.

Voici mon code php de requête:

$result = Document::join('user','document.user_id','=','user.id')
->join('classification','document.classification_id','=','classification.id')
->select('document.id',DB::raw('CONCAT(document.tracking_type,"-",document.tracking_date,"-",document.tracking_seq_no) AS tracking_id'),'document.date_prepared','document.subject','classification.description as doc_class')
->orderBy('document.created_at','desc')->get();

return Datatables::collection($result)
->addColumn('check',function($record){
    return '<input type="checkbox" name="check['.$record->id.']" class="checkboxes" value='.$record->id.'>';})
->addColumn('action',function($record){
    return '<a href="/records/view/' . $record->tracking_id . '">View Record</a></a>';})
->addColumn('document.tracking_id',function($record){
    return $record->tracking_id;})
->editColumn('document.doc_class',function($record){
    return $record->doc_class;})
->addColumn('document.subject',function($record){
    return $record->subject;})
->addColumn('document.date_prepared',function($record){
    return date('F d, Y', strtotime($record->date_prepared));})
->make(true);

Déclaration JS:

docstable = $('.docstable').DataTable({
    processing: true,
    serverSide: true,
    ajax: "/ajax/docrec"
    columnDefs: [
        {targets:[0,1], orderable:false}
    ],
    columns: [
        {data:'check'},
        {data:'action'},
        {data:'tracking_id',name:'document.tracking_id'},
        {data:'doc_class',name:'document.doc_class'},
        {data:'subject',name:'document.subject'},
        {data:'date_prepared',name:'document.date_prepared'}
    ]
});

Existe-t-il un moyen comme Bllim Datatables qui peut rechercher toutes les colonnes spécifiées en utilisant searchColumns () dans le code php? Merci

question

Commentaire le plus utile

Salut @ChaosPower et merci beaucoup pour votre réponse.

J'ai essayé votre solution mais cela n'a pas fonctionné. En fait, $this->mainRepo->model est mon instance de modèle, de App \ Models. Il est lié aux trucs mainRepo mais ce n'est pas lié à mon problème.
J'ai mis à jour pour avoir quelque chose comme ça (à partir de mon référentiel):
$query = $this->model->with($with);
$dataTable ?: $query->orderBy($orderBy, $sort);
return !$dataTable ? $query->get($columns) : $query->select($columns);

J'utilise cette méthode pour gérer toutes les données DataTables de mes modèles. Si la variable dataTable est fausse, aucun ordre n'est appliqué et j'utilise un select('*') .

Au final, la méthode chaînée pourrait ressembler à:
$this->model->with('relation')->select('*');$this->model est App\Models\User .

L'ordre des colonnes fonctionne désormais parfaitement, mais la recherche de texte par défaut n'a toujours aucun effet sur la recherche. Tous les résultats ne sont pas affichés en fonction de mon entrée.
Ai-je encore fait quelque chose de mal?

Nous voyons ici mon entrée de recherche, mais tous mes 3 utilisateurs sont renvoyés, même si l'entrée «ma valeur de recherche» ne doit rien renvoyer.
capture

Merci beaucoup pour votre aide

Tous les 17 commentaires

La recherche rapide dans toutes les colonnes est prise en charge par défaut, mais comme vous utilisez des requêtes de jointure, il y a quelques changements sur la façon dont vous devez déclarer le nom sur votre script comme sur cette démo .

BTW, pourquoi utilisez la collection au lieu d'éloquent? Je vous suggère de supprimer get() sur votre requête et d'utiliser return Datatables::eloquent($result) place?

Bonjour !
Pour moi, la recherche globale renvoie toujours un résultat vide. Ma table de données est vide après la recherche. Rempli de toutes les données lorsque je supprime toutes les entrées de recherche.
Mais je le fais aussi simple que:
$users = $this->mainRepo->model->get(); return Datatables::of($users)->make(true);

Je peux voir dans la requête HTTP mon entrée de recherche, mais le résultat de la ligne est toujours vide. Dois-je faire quelque chose côté serveur pour autoriser les options de recherche globale? Je pensais que c'était automatique ...
capture

Les données viennent de mon référentiel avec en gros un $ model-> get () sans aucun ordre / tri. J'ai pensé qu'il suffisait de faire un filtrage de texte global et de colonne. Mais dois-je mettre en œuvre une solution pour utiliser un «où» dans ma demande Eloquent? Ou est-il préférable de filtrer en utilisant la méthode de filtrage DataTables? (Dans le cas où rien n'est automatique, et je dois tout faire côté serveur).

Mais cet exemple et celui-ci n'implémentent aucun traitement côté serveur, et obtiennent une recherche globale, même par recherche de colonne ... J'ai essayé tous ces exemples, sans succès: le résultat de la recherche est toujours vide, la datatable est vide au premier caractère de recherche soumettre, et de nouveau rempli avec toutes les données lorsqu'aucun filtre n'est rempli ...

Les questions de base sont: Y a-t-il quelque chose d'implémenté dans le package pour le filtrage / la recherche côté serveur à partir des données de modèle, ou n'y a-t-il que le tri et la pagination des colonnes disponibles?

Merci beaucoup pour votre lecture et votre aide!

PS: lié à mon commentaire # 562

@ mtx-z lorsque vous invoquez -> get (), vous utilisez des collections au lieu de l'objet de LDT.

$users = User::select(['id', 'name', 'email', 'password', 'created_at', 'updated_at']); //Eloquent Object

$users->all(); // Collection

Laravel Datatables fait automatiquement -> get () et je vous conseille de ne pas utiliser -> get () lorsque vous

return Datatables::of($users)->make(true);

Sur la base de votre exemple, vous n'avez pas besoin -> get ()


$users = $this->mainRepo->model->get(); return Datatables::of($users)->make(true);

juste


$users = $this->mainRepo->model; return Datatables::of($users)->make(true);

Pour votre question principale concernant le filtrage et la recherche. Laravel Datatables implémente déjà la recherche dans toutes les colonnes par défaut / traitement côté serveur. Et prend également en charge le filtrage de colonne individuelle.

https://datatables.yajrabox.com/eloquent/basic - voir les en-têtes transmis
https://datatables.yajrabox.com/eloquent/multi-filter-select - voir les en-têtes transmis

Salut @ChaosPower et merci beaucoup pour votre réponse.

J'ai essayé votre solution mais cela n'a pas fonctionné. En fait, $this->mainRepo->model est mon instance de modèle, de App \ Models. Il est lié aux trucs mainRepo mais ce n'est pas lié à mon problème.
J'ai mis à jour pour avoir quelque chose comme ça (à partir de mon référentiel):
$query = $this->model->with($with);
$dataTable ?: $query->orderBy($orderBy, $sort);
return !$dataTable ? $query->get($columns) : $query->select($columns);

J'utilise cette méthode pour gérer toutes les données DataTables de mes modèles. Si la variable dataTable est fausse, aucun ordre n'est appliqué et j'utilise un select('*') .

Au final, la méthode chaînée pourrait ressembler à:
$this->model->with('relation')->select('*');$this->model est App\Models\User .

L'ordre des colonnes fonctionne désormais parfaitement, mais la recherche de texte par défaut n'a toujours aucun effet sur la recherche. Tous les résultats ne sont pas affichés en fonction de mon entrée.
Ai-je encore fait quelque chose de mal?

Nous voyons ici mon entrée de recherche, mais tous mes 3 utilisateurs sont renvoyés, même si l'entrée «ma valeur de recherche» ne doit rien renvoyer.
capture

Merci beaucoup pour votre aide

Je l'ai finalement fait :) ty

Je ne peux pas non plus rechercher de relation, j'ai utilisé $ this-> model-> with ('relation') -> select ('*');
mtx-z pouvez-vous partager la solution?

Hé. Le code que j'ai utilisé était spécifique à moi.
Le modèle this-> contient une instance de mon modèle.

Pouvez-vous fournir votre code?

\\ In controller
$result = MsCustomer::with('company')->select('ms_customers.*');
return Datatables::of($result)->make(true);

\\ In view
$('#data-table').DataTable({
    ajax: '{!! route('master.customer.data') !!}',
    columns: [
        { data: 'id', name: 'id' },
        { data: 'code', name: 'code' },
        { data: 'name', name: 'name' },
        { data: 'email', name: 'email' },
        { data: 'company.name', name: 'company.name' },
   ]
});

Les données d'exécution et d'affichage des tables de données incluent la relation company.name , mais ne peuvent pas rechercher la relation. Je suppose que le code est déjà similaire à cette démo

J'ai le modèle MsCustomer avec declare protected $ table = 'ms_customers', également une relation 'entreprise' dans le modèle MsCustomer. Puis le modèle MsCompany avec le nom de table 'ms_companies'.

Je peux rechercher un identifiant, un code, un nom et un e-mail, mais pas la relation «société.nom». Il y a un problème avec le code ci-dessus?

J'ai le même problème avec @maengkom , ma table s'est bien chargée. mais quand je recherche le résultat toujours vide

dans le contrôleur

$agenda = AgendaMasuk::with('surat')
            ->whereNotNull('surat_id')->where('group_id', $group->id)
            ->select('agenda_masuks.*');
        return Datatables::of($agenda)->make(true);

en vue

var table = $('#surats').DataTable({
        "jQueryUI"   : true,
        "paging"     : true,
        "lengthMenu" : [ 5, 10, 25, 50, 75, 100, "All" ],
        "autoWidth"  : false,
        "stateSave"  : false,
        "order"      : [[ 0, 'asc' ]],
        "processing" : true,
        "scrollX"    : true,
        "serverSide" : true,
        "ajax": {
            "url": $('#surats').data('url'),
            "type": "POST"
        },
        "columns": [
            {
                className: 'text-center',
                data: 'no_agenda',
                name: 'agenda_masuks.no_agenda'
            },
            {
                className: 'text-center',
                data: 'surat.no_surat',
                name: 'surat.no_surat'
            },
            {
                className: 'text-center',
                data: 'tanggal',
                name: 'agenda_masuks.tanggal'
            },
            {
                data: 'surat.sifat',
                name: 'surat.sifat',
                sortable: false
            },
            {
                data: 'surat.pengirim',
                name: 'surat.pengirim'
            },
            {
                data: 'surat.tujuan',
                name: 'surat.tujuan'
            },
            {
                data: 'surat.ringkasan',
                name: 'surat.ringkasan',
                sortable: false
            },
            {
                data: null,
                defaultContent: '-',
                name: 'disposisi',
                searchable: false,
                sortable: false
            },
            {
                data: null,
                defaultContent: '-',
                name: 'file',
                searchable: false,
                sortable: false
            }
        ]
    });

@maengkom J'ai le même problème, je n'ai pas pu utiliser la recherche globale sur les valeurs d'objet ET les valeurs de relation (uniquement l'id).
Par exemple, tous mes modèles ont un "translation_model" associé. Qui contient le texte public et seulement lui. Eh bien, mon datatable ne peut pas rechercher automatiquement le nom des traductions.

Pour résoudre ce problème, j'ai modifié l'appel ajax pour ajouter un paramètre (recherche de texte, sélection de valeur ...) et j'utilise ces valeurs pour filtrer la requête éloquente avant de l'envoyer à Datatable.
De là, vous pouvez filtrer sur n'importe quoi (pour le cas réel, c'est un «où» avec un «alors translation» où «Translations.name = 'search_value'» car il est éloquent.

@nsetyo avez-vous vérifié la collection retournée? Les données de la collection correspondent-elles aux besoins de datatable?

@ mtx-z oui. Je corrige temporairement ce problème en utilisant plutôt des requêtes de jointure

@nsetyo @ mtx-z le propriétaire a déjà confirmé que la relation de recherche a toujours un bogue. Vérifiez ceci https://github.com/yajra/laravel-datatables/issues/698

J'essaie d'aider à le réparer et j'apprends toujours le code dans la méthode de filtrage à l'intérieur du paquet, mais je ne sais toujours pas où doit être corrigé 😆

Tous mes champs de recherche fonctionnent maintenant mais il me reste 1 problème. Sur la base de la démo donnée par yajra (propriétaire), il y a le champ Créé à et mis à jour à dans le tableau. J'ai également un champ dans ma table affichant la date et l'heure, mais le fait est que si j'ai formaté la date et l'heure affichées de manière beaucoup plus lisible pour les utilisateurs, le datatable n'a pas pu rechercher ces date et heure nouvellement formatées.

Exemple: (Format de date et d'heure par défaut affiché)
23/08/2016 14:37:25

Je l'ai formaté en:
23 AOÛT 2016 14:37:25

en utilisant date('F d, Y h:i:s a',strtotime($the_given_date_and_time));

Après le formatage, la table de données n'a pas pu rechercher ce champ

Vous pouvez utiliser filterColumn api pour remplacer le sql par défaut pour la recherche sur la colonne de date pour correspondre à ce qui était affiché.

Pour addcolumn, il doit pouvoir être recherché.

Cette page vous a été utile?
0 / 5 - 0 notes