Laravel-datatables: 大表上的空结果集yajra数据表

创建于 2016-11-26  ·  3评论  ·  资料来源: yajra/laravel-datatables

我有一个由大约30,000条记录组成的Question模型,如下所示:

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


    }

为了显示所有问题的列表,我正在使用yajra datatable laravel软件包。

这是我的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'}
                        ]
                    });

在后端,我编写了以下函数:

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

首先,当我的表有几行时,一切正常,但是当我添加大量新记录时, questionsDatatable返回空值,并导致数据表返回警报错误。

有什么问题? 有没有可用于解决此问题的参数?

question

最有用的评论

实际上,您正在加载所有记录,这肯定会耗尽您的大量资源。 我建议您删除get 。 尝试以下类似的方法。

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

所有3条评论

您是否尝试过检查ajax请求? 它应该使您对导致问题的原因进行错误转储。

@yajra ,是的,但是只是一个空响应,并返回了500 Internal Server Error状态码。

当然,在提取问题和出于某种原因调用app('datatables')迭代结果之间,我应该在$questions上使用get()方法,然后使用each()方法。 实际上我的后端代码是:

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

我不知道这是错误的原因吗?

实际上,您正在加载所有记录,这肯定会耗尽您的大量资源。 我建议您删除get 。 尝试以下类似的方法。

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);
}
此页面是否有帮助?
0 / 5 - 0 等级

相关问题

SGarridoDev picture SGarridoDev  ·  3评论

ghost picture ghost  ·  3评论

Mopster picture Mopster  ·  3评论

nasirkhan picture nasirkhan  ·  3评论

vipin733 picture vipin733  ·  3评论