Laravel-datatables: leere Ergebnismenge yajra datierbar auf großen Tabellen

Erstellt am 26. Nov. 2016  ·  3Kommentare  ·  Quelle: yajra/laravel-datatables

Ich habe ein Question Modell von ungefähr 30.000 Datensätzen wie diesen:

class Question extends Model
    {
        use SoftDeletes;

        protected $primaryKey = 'question_id';

        protected $fillable   = ['text', 'code', 'cat', 'answer', 'confirmed', 'is_private', 'email', 'parent', 'expert'];

        public function sub_questions ()
        {
            return $this->hasMany(Question::class, 'parent', 'question_id');
        }

        public function latest_sub_question ()
        {
            return $this->hasOne(Question::class, 'parent', 'question_id')->latest();
        }


    }

Um eine Liste aller Fragen anzuzeigen, verwende ich ein datierbares Yajra-Laravel-Paket.

Das ist mein js Code:

var allQuestionsTable =
$('#allQuestionsTable').DataTable({
                        processing: true,
                        serverSide: true,
                        "bSort": false,
                        "responsive": true,
                        ajax: {
                            url: '{!! route('admin.questionsDatatable') !!}'
                        },
                        columns: [
                            {data: 'checkbox'},
                            {data: 'code', name: 'code'},
                            {data: 'text', name: 'text'},
                            {data: 'created_at'},
                            {data: 'answer', name: 'answer'},
                            {data: 'expert'},
                            {data: 'confirmed'},
                            {data: 'actions'}
                        ]
                    });

Und im Backend habe ich diese Funktion geschrieben:

public function questionsDatatable (Request $request)
        {
            $questions = Question::with('latest_sub_question')->whereNull('parent');

            $datatable = app('datatables')->of($questions)
                ->addColumn('checkbox', '<input type="checkbox" name="item_id[]" value="{{$question_id}}" id="Check_{{$question_id}}">');

                //other column modifications comes here

            return $datatable->make(true);
        }

Zuerst, als meine Tabelle ein paar Zeilen hatte, funktionierte alles einwandfrei, aber als ich eine große Anzahl neuer Datensätze hinzufügte, gab questionsDatatable leeren Wert zurück und verursachte, dass Datentabellen einen Warnfehler zurückgaben.

was ist das Problem ? und gibt es einen Parameter, mit dem dieses Problem gelöst werden kann?

question

Hilfreichster Kommentar

Sie laden tatsächlich alle Ihre Datensätze, was definitiv einen Großteil Ihrer Ressourcen verschlingen würde. Ich schlage vor, Sie entfernen get . Versuchen Sie etwas wie unten.

public function questionsDatatable (Request $request)
{
    $questions = Question::with('latest_sub_question')->whereNull('parent');
    $datatable = app('datatables')->of($questions)
        ->addColumn('checkbox', '<input type="checkbox" name="item_id[]" value="{{$question_id}}" id="Check_{{$question_id}}">');
        ->editColumn('latest_sub_question', function($item) {
            return is_null($item->latest_sub_question) ? $item : $item->latest_sub_question;
        })
        //other column modifications comes here

    return $datatable->make(true);
}

Alle 3 Kommentare

Haben Sie versucht, die Ajax-Anfrage zu überprüfen? Es sollte Ihnen einen Fehlerbericht darüber geben, was das Problem verursacht.

@yajra , Ja, ich habe es getan, aber nur eine leere Antwort und der Statuscode 500 Internal Server Error zurückgegeben.

Natürlich sollte ich zwischen dem Abrufen von Fragen und dem Aufrufen von app('datatables') aus irgendeinem Grund, um das Ergebnis zu wiederholen, die Methode get() und dann die Methode each() für $questions . Tatsächlich lautet mein Backend-Code:

public function questionsDatatable (Request $request)
        {
            $questions = Question::with('latest_sub_question')->whereNull('parent');
             $questions = $questions->get();

            $questions = $questions->map(function ($item, $key) {
                return is_null($item->latest_sub_question) ? $item : $item->latest_sub_question;
            });

            $questions->sortByDesc('created_at');

            $datatable = app('datatables')->of($questions)
                ->addColumn('checkbox', '<input type="checkbox" name="item_id[]" value="{{$question_id}}" id="Check_{{$question_id}}">');

                //other column modifications comes here

            return $datatable->make(true);
        }

Ich weiß nicht, ob das ein Grund für den Fehler ist oder nicht?

Sie laden tatsächlich alle Ihre Datensätze, was definitiv einen Großteil Ihrer Ressourcen verschlingen würde. Ich schlage vor, Sie entfernen get . Versuchen Sie etwas wie unten.

public function questionsDatatable (Request $request)
{
    $questions = Question::with('latest_sub_question')->whereNull('parent');
    $datatable = app('datatables')->of($questions)
        ->addColumn('checkbox', '<input type="checkbox" name="item_id[]" value="{{$question_id}}" id="Check_{{$question_id}}">');
        ->editColumn('latest_sub_question', function($item) {
            return is_null($item->latest_sub_question) ? $item : $item->latest_sub_question;
        })
        //other column modifications comes here

    return $datatable->make(true);
}
War diese Seite hilfreich?
0 / 5 - 0 Bewertungen