私は次のような約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 datatablelaravelパッケージを使用しています。
これは私の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
空の値を返し、datatablesがアラートエラーを返します。
問題は何ですか? この問題を解決するために使用できるパラメータはありますか?
ajaxリクエストを調べてみましたか? 問題の原因に関するエラーダンプが表示されます。
@yajra 、はい、そうしましたが、空の応答と500 Internal Server Error
ステータスコードが返されました。
質問をフェッチの間で呼び出す前に、当然のapp('datatables')
私は使うべき結果反復するために、何らかの理由でget()
の方法して、使用each()
の方法$questions
。 実際、私のバックエンドコードは次のとおりです。
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
を削除することをお勧めします。 以下のようなものを試してください。