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') ํ˜ธ์ถœํ•˜๊ธฐ ์ „์— get() ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•œ ๋‹ค์Œ $questions ์— 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 ๋“ฑ๊ธ‰