Laravel-datatables: conjunto de resultados vacío yajra datatable en tablas grandes

Creado en 26 nov. 2016  ·  3Comentarios  ·  Fuente: yajra/laravel-datatables

Tengo un modelo Question por aproximadamente 30,000 registros como este:

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


    }

Para mostrar una lista de todas las preguntas, estoy usando el paquete laravel de tabla de datos yajra.

Este es mi código 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'}
                        ]
                    });

Y en el back-end escribí esta función:

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

Primero, cuando mi tabla tenía algunas filas, todo funcionaba bien, pero cuando agregué una gran cantidad de registros nuevos, questionsDatatable devuelve un valor vacío y las tablas de datos devuelven un error de alerta.

cual es el problema ? y ¿hay algún parámetro que pueda utilizar para solucionar este problema?

question

Comentario más útil

De hecho, está cargando todos sus registros, lo que definitivamente consumiría muchos de sus recursos. Le sugiero que elimine get . Prueba algo como a continuación.

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

Todos 3 comentarios

¿Ha intentado inspeccionar la solicitud ajax? Debería darle un volcado de errores sobre la causa del problema.

@yajra , Sí, lo hice, pero solo una respuesta vacía y el código de estado 500 Internal Server Error devuelto.

por supuesto, entre la búsqueda de preguntas y antes de llamar a app('datatables') por alguna razón para iterar el resultado, debería usar el método get() y luego usar el método each() en $questions . de hecho, mi código de backend es:

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

No sé que es la razón del error o no?

De hecho, está cargando todos sus registros, lo que definitivamente consumiría muchos de sus recursos. Le sugiero que elimine get . Prueba algo como a continuación.

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);
}
¿Fue útil esta página
0 / 5 - 0 calificaciones

Temas relacionados

macnux picture macnux  ·  3Comentarios

kamrava picture kamrava  ·  3Comentarios

vipin733 picture vipin733  ·  3Comentarios

hohuuhau picture hohuuhau  ·  3Comentarios

sangnguyenplus picture sangnguyenplus  ·  3Comentarios