Laravel-datatables: jeu de résultats vide yajra datatable sur de grandes tables

Créé le 26 nov. 2016  ·  3Commentaires  ·  Source: yajra/laravel-datatables

J'ai un modèle Question d'environ 30000 enregistrements comme celui-ci:

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


    }

Pour afficher une liste de toutes les questions, j'utilise le package laravel datatable yajra.

Voici mon code js:

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

Et dans le back-end, j'ai écrit cette fonction:

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

D'abord lorsque ma table avait quelques lignes, tout fonctionnait bien, mais lorsque j'ai ajouté un grand nombre de nouveaux enregistrements, questionsDatatable renvoie une valeur vide et les tables de données renvoient une erreur d'alerte.

quel est le problème? et y a-t-il un paramètre qui peut utiliser pour résoudre ce problème?

question

Commentaire le plus utile

Vous chargez en effet tous vos enregistrements, ce qui consommerait certainement beaucoup de vos ressources. Je vous suggère de supprimer get . Essayez quelque chose comme ci-dessous.

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

Tous les 3 commentaires

Avez-vous essayé d'inspecter la demande ajax? Cela devrait vous donner un vidage des erreurs sur la cause du problème.

@yajra , Oui, mais juste une réponse vide et le code de statut 500 Internal Server Error est retourné.

Bien sûr, entre la récupération des questions et avant d'appeler app('datatables') pour une raison quelconque pour itérer le résultat, je devrais utiliser la méthode get() , puis utiliser la méthode each() sur $questions . en fait mon code backend est:

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

Je ne sais pas que c'est une raison de l'erreur ou non?

Vous chargez en effet tous vos enregistrements, ce qui consommerait certainement beaucoup de vos ressources. Je vous suggère de supprimer get . Essayez quelque chose comme ci-dessous.

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