我有一个由大约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
返回空值,并导致数据表返回警报错误。
有什么问题? 有没有可用于解决此问题的参数?
您是否尝试过检查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);
}
最有用的评论
实际上,您正在加载所有记录,这肯定会耗尽您的大量资源。 我建议您删除
get
。 尝试以下类似的方法。