Laravel-datatables: ๋งž์ถค ๋“œ๋กญ ๋‹ค์šด ํ•„ํ„ฐ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

์— ๋งŒ๋“  2017๋…„ 10์›” 25์ผ  ยท  12์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: yajra/laravel-datatables

๋ฌธ์ œ ์š”์•ฝ ๋˜๋Š” ๊ธฐ๋Šฅ ์š”์ฒญ


์‚ฌ์šฉ์ž ์ง€์ • ๋“œ๋กญ ๋‹ค์šด์„ ์‚ฌ์šฉํ•˜๋Š” ๋ฐ์ดํ„ฐ ํ•„ํ„ฐ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์ด์ œ ์ž˜ ํ˜•์‹์œผ๋กœ ํ‘œ์‹œ๋˜๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด์ œ ๋“œ๋กญ ๋‹ค์šด ๊ฐ’์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ํ•„ํ„ฐ๋งํ•˜๋ ค๋ฉด ํ—ค๋”์— ์‚ฌ์šฉ์ž ์ง€์ • ๋“œ๋กญ ๋‹ค์šด์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. [์ฐธ๊ณ  : laravel ์ฟผ๋ฆฌ์˜ ํ•„ํ„ฐ์—์ด ๋“œ๋กญ ๋‹ค์šด ๊ฐ’์„ ์ œ๊ณตํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์‚ฌ์šฉ์ž ์ง€์ • ๊ฐ’์ด๋ฏ€๋กœ์ด ์‚ฌ์šฉ์ž ์ง€์ • ๊ฐ’์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ํ•„ํ„ฐ๋งํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.]

๋ฌธ์ œ์˜ ์ฝ”๋“œ ์Šค ๋‹ˆํŽซ

์ด ์ฝ”๋“œ๋Š” ๊ธฐ๋ณธ ํ•„ํ„ฐ์—์„œ ์ž‘๋™ํ•˜์ง€๋งŒ jquery๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋“œ๋กญ ๋‹ค์šด์„ ์ถ”๊ฐ€ ํ–ˆ์œผ๋ฏ€๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ํ•„ํ„ฐ๋งํ•˜๋ ค๋ฉด laravel ์ฟผ๋ฆฌ์—์„œ์ด ๊ฐ’์„ ์ „๋‹ฌํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

$(function () {
    var t = $('#user').DataTable({
        order: [[ 0, 'desc' ]],
        processing: true,
        serverSide: true,
        ajax: {
            url: '{!! route('datatables.data') !!}',
            data: function(d) {
                d.name = $('input[name=name]').val();
                d.email = $('input[name=email]').val();
            }
        },
        columns: [
            { data: 'id', name: 'id' },
            { data: 'name', name: 'name' },
            { data: 'email', name: 'email' },
            { data: 'arrival_date', name: 'arrival_date', orderable: true, searchable: true },
            { data: 'pick_up', name: 'pick_up', orderable: true, searchable: true },
            { data: 'destination', name: 'destination', orderable: true, searchable: true},
            { data: 'trekking_start_date', name: 'trekking_start_date', orderable: true, searchable: true},

            { data: 'trekking_end_date', name: 'trekking_end_date', orderable: true, searchable: true},
            { data: 'action', name: 'action', orderable: false, searchable: false},
        ]
    });
});

$(document).ready(function() {
    $('<label style="margin-left: 10px;">Filter by ' +
        '<select class="form-control input-sm">'+
            '<option value="volvo">Completed Trip</option>'+
            '<option value="saab">Upcoming Trip</option>'+
        '</select>' + 
        '</label>').appendTo("#user_wrapper #user_length");
});

๊ทธ๋ฆฌ๊ณ  laravel์˜ ๋‚ด ์ฟผ๋ฆฌ ์ฝ”๋“œ

public function getClients(Request $request)
    {
        if($request->ajax()) {
            return Datatables::of(DB::select(DB::Raw('SELECT * FROM users WHERE id NOT IN (SELECT user_id FROM role_user) ORDER BY users.id DESC')))
                    //}))
                    ->addColumn('arrival_date', function($user){
                        if(isset(Helper::getFlightsByClientID($user->id)->arrival_date)) {
                            return date('M j, Y', strtotime(Helper::getFlightsByClientID($user->id)->arrival_date));
                        } else {
                            return 'N/A';
                        }
                    })
                    ->addColumn('pick_up', function($user){
                        if(isset(Helper::getFlightsByClientID($user->id)->pick_up)) {
                            return Helper::getFlightsByClientID($user->id)->pick_up == 1 ? 'Yes' : 'No'; 
                        } else {
                            return 'N/A';
                        }
                    })
                    ->addColumn('destination', function($user){
                        if(isset(Helper::getTreksByClientID($user->id)->trekking_region_id)) {
                            return Helper::getTrekByID(Helper::getTreksByClientID($user->id)->trekking_region_id)->name; 
                        } else {
                            return 'N/A';
                        }
                    })
                    ->addColumn('trekking_start_date', function($user){
                        if(isset(Helper::getTreksByClientID($user->id)->trekking_start_date)) {
                            return date('M j, Y', strtotime(Helper::getTreksByClientID($user->id)->trekking_start_date));
                        } else {
                            return 'N/A';
                        }
                    })
                    ->addColumn('trekking_end_date', function($user){
                        if(isset(Helper::getTreksByClientID($user->id)->trekking_end_date)) {
                            return date('M j, Y', strtotime(Helper::getTreksByClientID($user->id)->trekking_end_date));
                        } else {
                            return 'N/A';
                        }
                    })
                    ->addColumn('action', function($user){
                        $html = '';
                        $html .= '<a class="btn bg-green btn-flat btn-xs" href="'.route('user.clients.edit', $user->id).'">Edit</a>';

                        if(auth()->user()->hasRole('superadmin')) {
                            $html .= ' <a onclick="if(!confirm(\'Are u sure to delete?\')) return false;" class="btn bg-red btn-flat btn-xs" href="'.route('user.clients.delete', $user->id).'">Delete</a>';
                        }

                        return $html;

                    })
                    ->make(true);
        } else {
            abort(400, 'Bad Request.');
        }
    }

ํ•ด๋‹น๋˜๋Š” ๊ฒฝ์šฐ ์˜์‹ฌ๋˜๋Š” ๋ฒ„๊ทธ๋ฅผ ์œ ๋ฐœํ•˜๋Š” ์ฝ”๋“œ ์‚ฌ๋ณธ์„ ํฌํ•จํ•˜์‹ญ์‹œ์˜ค. ๋งˆํฌ ๋‹ค์šด PHP ์ฝ”๋“œ ํƒœ๊ทธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ถ™์—ฌ ๋„ฃ๊ธฐ ํ˜•์‹์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. md5-42b62c99f5c90574389e92bc9e32fddb

์‹œ์Šคํ…œ ์„ธ๋ถ€ ์ •๋ณด

์‹œ์Šคํ…œ์— ๋Œ€ํ•œ ์„ธ๋ถ€ ์ •๋ณด๋ฅผ ํฌํ•จํ•˜์‹ญ์‹œ์˜ค! ์ƒ๋žตํ•˜๋ฉด ๋‹ค๋ฅธ ์‚ฌ์šฉ์ž์˜ ์š”์ฒญ / ํ‹ฐ์ผ“๋ณด๋‹ค ํ‹ฐ์ผ“์˜ ์šฐ์„  ์ˆœ์œ„๊ฐ€ ๋‚ฎ์•„์ง‘๋‹ˆ๋‹ค.
  • ์šด์˜ ์ฒด์ œ Ubuntu 16.04
  • PHP ๋ฒ„์ „ 7.0.22
  • Laravel ๋ฒ„์ „ 5.4
  • Laravel-Datatables ๋ฒ„์ „ 1.10.16

Screenshot

question

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

ํ•„ํ„ฐ๊ฐ€ ๋ณ€๊ฒฝ๋˜๋ฉด ๊ทธ๋ฆฌ๊ธฐ๋ฅผ ํŠธ๋ฆฌ๊ฑฐํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ์•„๋งˆ๋„ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

<select class="form-control input-sm" id="custom-filter" onchange="$('#user').DataTable().draw()">

๋˜ํ•œ ์ปฌ๋ ‰์…˜์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋ณ€ํ•˜๊ฒŒ ํ•˜๋‹ค

DB::select(DB::Raw('SELECT * FROM users WHERE id NOT IN (SELECT user_id FROM role_user) ORDER BY users.id DESC'))

๋‹ค์Œ๊ณผ ๊ฐ™์ด :

DB::table('users')->whereNot(...);

๋ชจ๋“  12 ๋Œ“๊ธ€

@shankhadevpadam ๋‹น์‹ ์€ ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์œผ๋กœ ์ด๊ฒƒ์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋‚ด๊ฐ€ํ•˜๋Š” ์ผ์€ ์„œ๋ฒ„ ์ธก์˜ ๋ฐ์ดํ„ฐ ํ…Œ์ด๋ธ” ์•ž์— ์ฟผ๋ฆฌ ๋นŒ๋”๋ฅผ ์ „๋‹ฌํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

$model = new Example();
$model->where('column_to_filter','=',$this->request->get('filter_by'));

return datatables()->eloquent($model);

๋ฌผ๋ก  ์กฐ๊ฑด๋ถ€ IF๋ฅผ ์ˆ˜ํ–‰ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

$model = new Example();

if($this->request->has('name')) {
     $model->where('name','=','predefined value');
}

return datatables()->eloquent($model);

์œ„์˜ ์˜ˆ๋ฅผ ์›ํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ ๋ฌธ์„œ๋ฅผ ์ฐธ์กฐ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฒŒ์‹œ๋ฌผ ์—ด ๊ฒ€์ƒ‰ , ๋งž์ถค ํ•„ํ„ฐ

๋‚ด ์งˆ๋ฌธ์€ ์œ„์˜ ์ด๋ฏธ์ง€์™€ ๊ฐ™์ด ๋“œ๋กญ ๋‹ค์šด์„ ๋ฐ”์ธ๋”ฉํ•˜๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž ์ง€์ • jquery๋ฅผ ํ†ตํ•ด ๋ฐ”์ธ๋”ฉํ–ˆ์ง€๋งŒ ๋ฐ์ดํ„ฐ ํ…Œ์ด๋ธ”์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ”์ธ๋”ฉํ•ด์•ผํ•˜๋ฉฐ ๋“œ๋กญ ๋‹ค์šด์ด ๋ณ€๊ฒฝ ๋  ๋•Œ์ด ๊ฐ’์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด์•ผํ•ฉ๋‹ˆ๋‹ค. [Please look my code snippet]

์„ ํƒ ์ƒ์ž์— id ์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

<select class="form-control input-sm" id="custom-filter">

๊ทธ๋Ÿฐ ๋‹ค์Œ ์š”์ฒญ ๋งค๊ฐœ ๋ณ€์ˆ˜์— ํฌํ•จํ•ฉ๋‹ˆ๋‹ค.

        ajax: {
            url: '{!! route('datatables.data') !!}',
            data: function(d) {
                d.name = $('input[name=name]').val();
                d.email = $('input[name=email]').val();
                d.filter = $('#custom-filter').val();
            }
        },

๊ทธ๋Ÿฐ ๋‹ค์Œ ์„œ๋ฒ„ ์ธก์—์„œ ํ•„์š”ํ•œ ํ•„ํ„ฐ๋ฅผ ์ˆ˜ํ–‰ํ•˜์‹ญ์‹œ์˜ค.

if ($filter = request('filter')) {
    $query->where('filter', $filter);
}

ํ•„ํ„ฐ๊ฐ€ ๋ณ€๊ฒฝ๋˜๋ฉด ๊ทธ๋ฆฌ๊ธฐ๋ฅผ ํŠธ๋ฆฌ๊ฑฐํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ์•„๋งˆ๋„ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

<select class="form-control input-sm" id="custom-filter" onchange="$('#user').DataTable().draw()">

๋˜ํ•œ ์ปฌ๋ ‰์…˜์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋ณ€ํ•˜๊ฒŒ ํ•˜๋‹ค

DB::select(DB::Raw('SELECT * FROM users WHERE id NOT IN (SELECT user_id FROM role_user) ORDER BY users.id DESC'))

๋‹ค์Œ๊ณผ ๊ฐ™์ด :

DB::table('users')->whereNot(...);

๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

ํ™˜์˜ํ•ฉ๋‹ˆ๋‹ค. ์œ ์šฉํ•˜๋‹ค๊ณ  ์ƒ๊ฐ๋˜๋ฉด ํ”„๋กœ์ ํŠธ์— ๋ณ„ํ‘œ๋ฅผ ํ‘œ์‹œํ•˜๋Š” ๊ฒƒ์„ ์žŠ์ง€ ๋งˆ์‹ญ์‹œ์˜ค. :) ๊ฐ์‚ฌ!

๋“œ๋กญ ๋‹ค์šด์€ ์™„๋ฒฝํ•˜๊ฒŒ ์ž‘๋™ํ•˜์ง€๋งŒ ๋“œ๋กญ ๋‹ค์šด์˜ ๊ฐ’ ๋ณ€๊ฒฝ ํ›„ ๋ฐ์ดํ„ฐ ํ‘œ์‹œ๊ฐ€ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ •๋ ฌ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

Screenshot

ํ•„ํ„ฐ๋ง ํ•  ๋•Œ ๋‚ ์งœ๋ณ„๋กœ ์ฃผ๋ฌธ ํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ? js ์ˆ˜์ค€์—์„œ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ๋˜๋Š” ๊ธฐ๋ณธ ์ˆœ์„œ๋ฅผ ํ•ด๋‹น ์—ด๋กœ ์„ค์ •ํ•˜์‹ญ์‹œ์˜ค.

์˜ˆ, ์˜ˆ๋ฅผ ๋“ค์–ด์ฃผ์„ธ์š”.

์˜ˆ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ์ฐธ์กฐ๋Š” ๊ณต์‹ js api ๋ฌธ์„œ https://datatables.net/reference/api/ ๋ฅผ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค. ํŠธ๋ฆญ์€ ํ…Œ์ด๋ธ” ๋‹ค์‹œ ๊ทธ๋ฆฌ๊ธฐ ๊ธฐ๋Šฅ์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์ „์— ์ˆ˜๋™ js ์ˆœ์„œ ๋ช…๋ น์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@yajra ๋ฐ์ดํ„ฐ ํ…Œ์ด๋ธ”์—์„œ ๋™๋“ฑํ•œ ์„œ๋น„์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

            data: function(d) {
                d.name = $('input[name=name]').val();
                d.email = $('input[name=email]').val();
                d.filter = $('#custom-filter').val();
            }

@sistemaswebbrasil ์‚ฌ์šฉ minifiedAjax() :

$script = '
data.name = $('input[name=name]').val();
data.email = $('input[name=email]').val();
data.filter = $('#custom-filter').val();
';

return $this
            ->builder()
            ...
            ->minifiedAjax($url = '', $script = null, $data = [])
์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰