Laravel-datatables: yajra Datatables Schnellsuchfunktion sucht nicht

Erstellt am 7. Juni 2016  ·  17Kommentare  ·  Quelle: yajra/laravel-datatables

Guten Tag!

Ich habe ein Problem mit der Suche nach Datensätzen in meinen Datentabellen. Es kann nur die Spalte tracking_id durchsucht werden. Ich brauche alle Spalten, um durchsucht zu werden.

Hier ist mein Abfrage-PHP-Code:

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

JS-Erklärung:

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

Gibt es eine Möglichkeit wie Bllim Datatables, die alle angegebenen Spalten mithilfe von searchColumns () im PHP-Code durchsuchen kann? Dankeschön

question

Hilfreichster Kommentar

Hallo @ChaosPower und vielen Dank für Ihre Antwort.

Ich habe Ihre Lösung ausprobiert, aber es hat nicht funktioniert. Eigentlich ist $this->mainRepo->model meine Modellinstanz aus App \ Models. Es ist an das mainRepo-Zeug gebunden, hat aber nichts mit meinem Problem zu tun.
Ich habe so etwas aktualisiert (aus meinem Repository):
$query = $this->model->with($with);
$dataTable ?: $query->orderBy($orderBy, $sort);
return !$dataTable ? $query->get($columns) : $query->select($columns);

Ich verwende diese Methode, um alle DataTables-Daten aus meinen Modellen zu verwalten. Wenn die Variable dataTable falsch ist, wird keine Reihenfolge angewendet, und ich verwende ein select('*') .

Am Ende könnte die verkettete Methode folgendermaßen aussehen:
$this->model->with('relation')->select('*'); wobei $this->model App\Models\User .

Die Spaltenreihenfolge funktioniert jetzt einwandfrei, aber die Standardtextsuche hat immer noch keine Auswirkungen auf die Suche. Alle Ergebnisse werden unabhängig von meiner Eingabe angezeigt.
Habe ich wieder etwas falsch gemacht?

Wir sehen hier meine Sucheingabe, aber alle meine 3 Benutzer werden zurückgegeben, auch wenn die Eingabe "Mein Suchwert" überhaupt nichts zurückgeben sollte.
capture

Vielen Dank für Ihre Hilfe

Alle 17 Kommentare

Die Schnellsuche in allen Spalten wird standardmäßig unterstützt. Da Sie jedoch Verknüpfungsabfragen verwenden, gibt es einige Änderungen, wie Sie den Namen in Ihrem Skript wie in dieser Demo deklarieren müssen.

Übrigens, warum verwenden Sie Sammlung statt Beredsamkeit? Ich schlage vor, Sie entfernen get() in Ihrer Abfrage und verwenden stattdessen return Datatables::eloquent($result) ?

Hallo !
Für mich liefert die globale Suche immer ein leeres Ergebnis. Meine Datentabelle ist nach der Suche leer. Mit allen Daten gefüllt, wenn ich alle Sucheingaben entferne.
Aber ich mache es so einfach wie:
$users = $this->mainRepo->model->get(); return Datatables::of($users)->make(true);

Ich kann in der HTTP-Anfrage meine Sucheingabe sehen, aber das Zeilenergebnis ist immer leer. Muss ich etwas serverseitig tun, um globale Suchoptionen zu ermöglichen? Ich dachte es wäre automatisch ...
capture

Daten kommen aus meinem Repository, wobei im Grunde genommen ein $ model-> get () ohne Bestellung / Sortierung ausgeführt wird. Ich dachte, es wäre genug, um eine globale und Spaltentextfilterung durchzuführen. Aber muss ich eine Lösung implementieren, um ein "Wo" in meiner eloquenten Anfrage zu verwenden? Oder ist es besser, mit der DataTables-Filtermethode zu filtern? (Falls nichts automatisch ist und ich alles serverseitig machen muss).

Aber dieses Beispiel und dieses keine serverseitige Verarbeitung implementieren, und eine globale Suche zu bekommen, auch pro Spalte Suche ... ich all diese Beispiele versuchten, ohne Erfolg: Sucher ist immer leer, ist Datentabelle leer auf dem ersten Suchzeichen Senden und zurück mit allen Daten gefüllt, wenn überhaupt kein Filter gefüllt ist ...

Grundlegende Fragen sind: Ist im Paket etwas für die serverseitige Filterung / Suche aus Modelldaten implementiert, oder sind nur Spaltensortierung und Paginierung verfügbar?

Vielen Dank für Ihre Lektüre und Ihre Hilfe!

PS: verlinkt auf meinen # 562 Kommentar

@ mtx-z Wenn Sie -> get () aufrufen, verwenden Sie Sammlungen anstelle des LDT-Objekts.

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

$users->all(); // Collection

Laravel Datatables macht automatisch -> get () und ich rate Ihnen, nicht zu verwenden -> get (), wenn Sie

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

Basierend auf Ihrem Beispiel brauchen Sie nicht -> get ()


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

gerade


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

Für Ihre Hauptfrage zum Filtern und Suchen. Laravel Datatables implementiert bereits die Suche in allen Spalten standardmäßig / serverseitig. Unterstützt auch die Filterung einzelner Spalten.

https://datatables.yajrabox.com/eloquent/basic - siehe übertragene Header
https://datatables.yajrabox.com/eloquent/multi-filter-select - siehe übertragene Header

Hallo @ChaosPower und vielen Dank für Ihre Antwort.

Ich habe Ihre Lösung ausprobiert, aber es hat nicht funktioniert. Eigentlich ist $this->mainRepo->model meine Modellinstanz aus App \ Models. Es ist an das mainRepo-Zeug gebunden, hat aber nichts mit meinem Problem zu tun.
Ich habe so etwas aktualisiert (aus meinem Repository):
$query = $this->model->with($with);
$dataTable ?: $query->orderBy($orderBy, $sort);
return !$dataTable ? $query->get($columns) : $query->select($columns);

Ich verwende diese Methode, um alle DataTables-Daten aus meinen Modellen zu verwalten. Wenn die Variable dataTable falsch ist, wird keine Reihenfolge angewendet, und ich verwende ein select('*') .

Am Ende könnte die verkettete Methode folgendermaßen aussehen:
$this->model->with('relation')->select('*'); wobei $this->model App\Models\User .

Die Spaltenreihenfolge funktioniert jetzt einwandfrei, aber die Standardtextsuche hat immer noch keine Auswirkungen auf die Suche. Alle Ergebnisse werden unabhängig von meiner Eingabe angezeigt.
Habe ich wieder etwas falsch gemacht?

Wir sehen hier meine Sucheingabe, aber alle meine 3 Benutzer werden zurückgegeben, auch wenn die Eingabe "Mein Suchwert" überhaupt nichts zurückgeben sollte.
capture

Vielen Dank für Ihre Hilfe

Ich habe es endlich geschafft :) ty

Ich kann auch plötzlich keine Relation suchen, ich habe $ this-> model-> with ('Relation') -> select ('*') verwendet;
mtx-z können Sie die Lösung teilen?

Hallo. Der Code, den ich verwendet habe, war spezifisch für mich.
Das this-> Modell enthält eine Instanz meines Modells.

Können Sie Ihren Code angeben?

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

Daten, die ausgeführt und angezeigt werden, enthalten die Beziehung company.name , können die Beziehung jedoch nicht durchsuchen. Ich denke, der Code ähnelt bereits dieser Demo

Ich habe das Modell MsCustomer mit der Deklaration protected $ table = 'ms_customers', auch die Beziehung 'company' innerhalb des MsCustomer-Modells. Dann MsCompany-Modell mit dem Tabellennamen 'ms_companies'.

Ich kann nach ID, Code, Name und E-Mail suchen, aber nicht nach der Beziehung 'company.name'. Stimmt etwas mit dem obigen Code nicht?

Ich habe das gleiche Problem mit @maengkom , meine Tabelle ist gut geladen. aber wenn ich suche ist das ergebnis immer leer

im Controller

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

im Hinblick auf

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 Ich habe das gleiche Problem, ich konnte die globale Suche für Objektwerte UND Beziehungswerte (nur die ID) nicht verwenden.
Zum Beispiel ist allen meinen Modellen ein "translation_model" zugeordnet. Die den öffentlichen Text enthalten und nur ihn. Nun, meine Datentabelle kann den Namen der Übersetzungen nicht automatisch suchen.

Um dies zu beheben, habe ich den Ajax-Aufruf bearbeitet, um einige Parameter hinzuzufügen (Textsuche, Wert auswählen ...), und ich verwende diese Werte, um die beredte Abfrage zu filtern, bevor ich sie an Datatable sende.
Von hier aus können Sie nach allem filtern (für den tatsächlichen Fall ist es ein "wo" mit einem "wohingegen" wo "translations.name = 'search_value'", da es eloquent ist.

@nsetyo hast du die zurückgegebene Sammlung überprüft? Entsprechen die Daten in der Sammlung den datierbaren Anforderungen?

@ mtx-z ja das tut es. Ich behebe dies vorübergehend, indem ich stattdessen Join-Abfragen verwende

@nsetyo @ mtx-z Der Eigentümer hat bereits bestätigt, dass die Suchbeziehung immer noch einen Fehler aufweist. Überprüfen Sie dies unter https://github.com/yajra/laravel-datatables/issues/698

Ich versuche zu helfen, das Problem zu beheben, und lerne immer noch den Code in der Filtermethode im Paket, aber ich verwirre immer noch, wo das Problem behoben werden soll 😆

Alle meine Suchfelder funktionieren jetzt, aber ich habe noch 1 Problem. Basierend auf der von yajra (Eigentümer) angegebenen Demo befindet sich in der Tabelle das Feld Erstellt um und aktualisiert um . Ich habe auch ein Feld in meiner Tabelle, in dem Datum und Uhrzeit angezeigt werden. Wenn ich jedoch das angezeigte Datum und die Uhrzeit so formatiert habe, dass sie für Benutzer gut lesbar sind, konnte die Datentabelle das neu formatierte Datum und die neu formatierte Uhrzeit nicht durchsuchen.

Beispiel: (Standardformat für Datum und Uhrzeit angezeigt)
2016-08-23 14:37:25

Ich habe das formatiert in:
23. AUGUST 2016 14:37:25 Uhr

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

Nach der Formatierung konnte die Datentabelle dieses Feld nicht durchsuchen

Sie können filterColumn api verwenden, um die Standard-SQL für die Suche nach Datumsspalte so zu überschreiben, dass sie mit der angezeigten übereinstimmt.

gefolgt von https://datatables.yajrabox.com/eloquent/joins wird funktionieren

Für addcolumn sollte es durchsuchbar sein.

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen