Laravel-datatables: ๊ฒฐํ•ฉ ๋œ ์—ด์—์„œ ๊ฒ€์ƒ‰์ด ์ž‘๋™ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

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

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


filtercolumn ()์„ ์‚ฌ์šฉํ•˜์—ฌ ์ด๋ฆ„๊ณผ ๊ฐ™์€ ์—ฌ๋Ÿฌ ์—ด์„ ๊ฒ€์ƒ‰ ํ•  ์ˆ˜ ์žˆ๋„๋กํ–ˆ์Šต๋‹ˆ๋‹ค (first_name ๋ฐ last_name์—์„œ ๊ฒฐํ•ฉ)
๋ฐ๋ชจ๋ฅผ ์ฝ์—ˆ์ง€๋งŒ ์ฟผ๋ฆฌ๊ฐ€ ๋‹ค๋ฅด๊ธฐ ๋•Œ๋ฌธ์— ์—ฌ์ „ํžˆ ํ˜ผ๋ž€ ์Šค๋Ÿฝ์Šต๋‹ˆ๋‹ค.

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

$(function () {
        $("#datatable").DataTable({
            processing: true,
            serverSide: true,
            "order": [[ 1, "asc" ]],
            ajax: "{!! route('admin.customers.getdata','Umum') !!}",
            columns: [
                { data: null, bSortable: false, className: "text-center" },
                { data: "id" },
                { data: "name", name: "name" },
                { data: "type" },
                { data: "email" },
                { data: "location" },
                { data: "active", bSortable: false, className: "text-center" },
                { data: "free_ongkir", bSortable: false, className: "text-center" },
                { data: "action", bSortable: false, className: "text-center" }
            ],
            fnRowCallback: function(nRow, aData, iDisplayIndex){
                $("td:first", nRow).html(iDisplayIndex +1);
                return nRow;
            }
        });

๊ทธ๋ฆฌ๊ณ  ์ด๊ฒƒ์€ ๋‚ด ์ปจํŠธ๋กค๋Ÿฌ์˜ ์ฝ”๋“œ

public function getdata($type)
    {
        $users = User::where(['type'=>$type])->whereHas('roles', function ($query) {
            $query->where('slug', '=', 'user');
        })->get();
        foreach ($users as $key => $value) {
            if($value->id == Sentinel::getUser()->id) $value->disabled = "disabled";
            else$value->disabled = "";
        }
        return Datatables::of($users)
        ->editColumn('name', '
            <a href="{{ route(\'admin.customers.show\', $id) }}">{!! $first_name." ".$last_name !!}</a>
        ')
        ->filterColumn('name', function($query, $keyword) {
                    $sql = "CONCAT(users.first_name,'-',users.last_name)  like ?";
                    $query->whereRaw($sql, ["%{$keyword}%"]);
                })
        ->editColumn('type', function($users) {
            if($users->hasAccess('superadmin')) return 'Super Admin';
            else return "Komoditi $users->type";
        })
        ->editColumn('active', function($users) {
            if(!$users->is_approved) {
                return '<span class="has-error form-group"><label><i class="fa fa-times-circle-o"></i> Belum di approve</label></span>';
            } else if(Activation::completed($users)) {
                return '<span class="has-success form-group"><label><i class="fa fa-check"></i> Aktif</label></span>';
            } else {
                return '<span class="has-error form-group"><label><i class="fa fa-times-circle-o"></i> Belum Aktivasi</label></span>';
            }
        })
        ->editColumn('free_ongkir', function($users) {
          if ($users->free_ongkir == 1) {
            return '<span class="has-success form-group"><label><i class="fa fa-check"></i></label></span>';
          }else {
            return '<span class="has-error form-group"><label><i class="fa fa-times-circle-o"></i></label></span>';
          }
        })
        ->editColumn('location', function($users){
            if(empty($users->city->name)) return 'None';
            else return $users->city->name;
        })
        ->addColumn('action', '@if(Sentinel::getUser()->hasAccess(["customers.edit"]))<button class="btn btn-primary" type="button" onClick="location.href=\'{{ route(\'admin.customers.edit\', $id) }}\'"><i class="fa fa-edit"></i></button>
            <strong i="13">@endif</strong>
            {!! Form::open([
                \'method\'=>\'DELETE\',
                \'route\' => [\'admin.customers.destroy\', $id],
                \'style\' => \'display:inline\'
            ]) !!}
            @if(Sentinel::getUser()->hasAccess(["customers.destroy"]))
                {!! Form::button(\'<i class="fa fa-trash"></i>\', [\'class\' => \'btn btn-danger btn-md\',\'type\'=>\'submit\',\'onclick\'=>\'return confirm("Are you sure want to delete?")\', $disabled]) !!}
             <strong i="14">@endif</strong>
            {!! Form::close() !!}

        ')
        ->make(true);
    }

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

  • ์šด์˜ ์ฒด์ œ : Ubuntu 16.04
  • PHP ๋ฒ„์ „ : 7.0
  • ๋ผ ๋ผ๋ฒจ ๋ฒ„์ „ : 5.1
  • Laravel-Datatables ๋ฒ„์ „ : 6.0
question

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

๋งˆ์ง€๋ง‰์œผ๋กœ ํ•ด๊ฒฐ๋˜๋ฉด ์ปจํŠธ๋กค๋Ÿฌ์™€ ๋ฐ์ดํ„ฐ ํ…Œ์ด๋ธ”์˜ ์ฟผ๋ฆฌ๋ฅผ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ˆ˜์ •ํ•ฉ๋‹ˆ๋‹ค.

$("#datatable").DataTable({
            processing: true,
            serverSide: true,
            "order": [[ 1, "asc" ]],
            ajax: "{!! route('admin.customers.getdata','Umum') !!}",
            columns: [
                { data: null, bSortable: false, className: "text-center" },
                { data: "id" },
                { data: "name", name: "full_name" },
                { data: "type" },
                { data: "email" },
                { data: "location" },
                { data: "active", bSortable: false, className: "text-center" },
                { data: "free_ongkir", bSortable: false, className: "text-center" },
                { data: "action", bSortable: false, className: "text-center" }
            ],
            fnRowCallback: function(nRow, aData, iDisplayIndex){
                $("td:first", nRow).html(iDisplayIndex +1);
                return nRow;
            }
        });

์ปจํŠธ๋กค๋Ÿฌ :

{
        $users = User::select('id','email','first_name','last_name','city_id', 'is_approved','type', DB::raw("CONCAT(first_name,' ',last_name) as full_name"))->where(['type'=>$type])->whereHas('roles', function ($query) {
            $query->where('slug', '=', 'user');
        })->get();
        foreach ($users as $key => $value) {
            if($value->id == Sentinel::getUser()->id) $value->disabled = "disabled";
            else$value->disabled = "";
        }
        return Datatables::of($users)
        ->editColumn('name', '
            <a href="{{ route(\'admin.customers.show\', $id) }}">{!! $first_name." ".$last_name !!}</a>
        ')
        ->editColumn('type', function($users) {
            if($users->hasAccess('superadmin')) return 'Super Admin';
            else return "Komoditi $users->type";
        })
        ->editColumn('active', function($users) {
            if(!$users->is_approved) {
                return '<span class="has-error form-group"><label><i class="fa fa-times-circle-o"></i> Belum di approve</label></span>';
            } else if(Activation::completed($users)) {
                return '<span class="has-success form-group"><label><i class="fa fa-check"></i> Aktif</label></span>';
            } else {
                return '<span class="has-error form-group"><label><i class="fa fa-times-circle-o"></i> Belum Aktivasi</label></span>';
            }
        })
        ->editColumn('free_ongkir', function($users) {
          if ($users->free_ongkir == 1) {
            return '<span class="has-success form-group"><label><i class="fa fa-check"></i></label></span>';
          }else {
            return '<span class="has-error form-group"><label><i class="fa fa-times-circle-o"></i></label></span>';
          }
        })
        ->editColumn('location', function($users){
            if(empty($users->city->name)) return 'None';
            else return $users->city->name;
        })
        ->addColumn('action', '@if(Sentinel::getUser()->hasAccess(["customers.edit"]))<button class="btn btn-primary" type="button" onClick="location.href=\'{{ route(\'admin.customers.edit\', $id) }}\'"><i class="fa fa-edit"></i></button>
            <strong i="9">@endif</strong>
            {!! Form::open([
                \'method\'=>\'DELETE\',
                \'route\' => [\'admin.customers.destroy\', $id],
                \'style\' => \'display:inline\'
            ]) !!}
            @if(Sentinel::getUser()->hasAccess(["customers.destroy"]))
                {!! Form::button(\'<i class="fa fa-trash"></i>\', [\'class\' => \'btn btn-danger btn-md\',\'type\'=>\'submit\',\'onclick\'=>\'return confirm("Are you sure want to delete?")\', $disabled]) !!}
             <strong i="10">@endif</strong>
            {!! Form::close() !!}

        ')
        ->make(true);
    }

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

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

@faisalhilmi ๋Š” https://github.com/yajra/laravel-datatables/issues/1173์—์„œ ์ œ๊ณต๋˜๋Š” ์†”๋ฃจ์…˜์„

๋‚˜๋Š” ์ฐธ์กฐ๋ฅผ ๋ณธ ๋‹ค์Œ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ˆ˜์ •ํ•˜๋ ค๊ณ ํ•ฉ๋‹ˆ๋‹ค.

{ data: "name", name: "name" },
{ data: "first_name", name: "first_name", visible: false },
{ data: "last_name", name: "last_name", visible: false },

์ปจํŠธ๋กค๋Ÿฌ์—์„œ :

        ->editColumn('name', '
            <a href="{{ route(\'admin.customers.show\', $id) }}">{!! $first_name." ".$last_name !!}</a>
        ')
        ->filterColumn('name', function($query, $keyword) {
                $query->orWhere('first_name', 'like', '%'. $keyword . '%');
                $query->orWhere('last_name', 'like', '%'. $keyword . '%');
            })

๊ทธ๋Ÿฌ๋‚˜ ๊ฒ€์ƒ‰์€ ์ด๋ฆ„ ๋˜๋Š” ์„ฑ๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ๋‘˜ ๋‹ค ์‚ฌ์šฉํ•  ์ˆ˜๋Š” ์—†์Šต๋‹ˆ๋‹ค.
๊ฐ€๋Šฅํ• ๊นŒ์š”?

์Œ, ์—ฌ๊ธฐ์— ๋‹ค์ค‘ ์šฉ์–ด ๊ฒ€์ƒ‰ ๊ธฐ๋Šฅ๊ณผ ๊ด€๋ จํ•˜์—ฌ ๋ฒ„๊ทธ๊ฐ€์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ „์ฒด ์ด๋ฆ„ ๊ณต๊ฐ„์„ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๊ตฌ๋ถ„ํ•˜์—ฌ ๊ฒ€์ƒ‰ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ? filterColumn์— ์ „๋‹ฌ ๋œ ํ‚ค์›Œ๋“œ๊ฐ€ ์ด์ œ ๋‘ ๋ถ€๋ถ„ (์ด๋ฆ„๊ณผ ์„ฑ)์œผ๋กœ ๋ถ„๋ฆฌ๋˜์—ˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์‹œ๋„ํ•ด ์ฃผ์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?

->filterColumn('name', function($query, $keyword) {
    $sql = "CONCAT(users.first_name,'-',users.last_name)  like ?";
    $keyword = request('search.value');
    $query->whereRaw($sql, ["%{$keyword}%"]);
})

์˜ˆ, ์ „์ฒด ์ด๋ฆ„์„ ๊ฒ€์ƒ‰ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค :)
๋‚˜๋Š” ์ด๋ ‡๊ฒŒ ์‹œ๋„ํ•œ๋‹ค

$users = User::where(['type'=>$type])->whereHas('roles', function ($query) {
            $query->where('slug', '=', 'user');
        })->get();
        foreach ($users as $key => $value) {
            if($value->id == Sentinel::getUser()->id) $value->disabled = "disabled";
            else$value->disabled = "";
        }
        return Datatables::of($users)
        ->editColumn('name', '
            <a href="{{ route(\'admin.customers.show\', $id) }}">{!! $first_name." ".$last_name !!}</a>
        ')
        ->filterColumn('name', function($query, $keyword) {
    $sql = "CONCAT(users.first_name,'-',users.last_name)  like ?";
    $keyword = request('search.value');
    $query->whereRaw($sql, ["%{$keyword}%"]);
})

ํ•˜์ง€๋งŒ ์—ฌ์ „ํžˆ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์‹ฌ์ง€์–ด filtercolumn์˜ $ query๋ฅผ $ users๋กœ ๋ณ€๊ฒฝํ•˜๋ ค๊ณ ํ•ฉ๋‹ˆ๋‹ค.

$ users ์ฟผ๋ฆฌ์— ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

ajax ์‘๋‹ต์— ์˜ค๋ฅ˜๊ฐ€ ๋ฐ˜ํ™˜๋ฉ๋‹ˆ๊นŒ?

์˜ค๋ฅ˜ ์—†์Œ, "๊ณ ๊ฐ umum"์„ ๊ฒ€์ƒ‰ ํ•  ๋•Œ "์ผ์น˜ํ•˜๋Š” ๋ ˆ์ฝ”๋“œ๋ฅผ ์ฐพ์„ ์ˆ˜ ์—†์Œ"
"customer"๋Š” users ํ…Œ์ด๋ธ”์—์„œ first_name์ž…๋‹ˆ๋‹ค.
"umum"์€ users ํ…Œ์ด๋ธ”์˜ last_name์ž…๋‹ˆ๋‹ค.

ajax ์š”์ฒญ์„ ๊ฒ€์‚ฌํ•˜๊ณ  ์ƒ์„ฑ ๋œ SQL์„ ๋ถ™์—ฌ ๋„ฃ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ๋‚˜๋Š” ๋‹น์‹ ์˜ SQL์— ๋ฌธ์ œ๊ฐ€ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ˆ˜๋™์œผ๋กœ ์‹คํ–‰ ํ•ด๋ณด์‹ญ์‹œ์˜ค.

๋ฐฉ๊ธˆ v6.x๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์œผ๋ฉฐ ์—ฌ๋Ÿฌ ์šฉ์–ด ๊ฒ€์ƒ‰์ด ์ ์šฉ๋˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์„ ๊นจ๋‹ฌ์•˜์Šต๋‹ˆ๋‹ค. ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค!

"yajra / laravel-datatables-oracle": "~ 6.0", ๊ทธ๊ฒŒ ๋ฌธ์ œ์ž…๋‹ˆ๊นŒ?

์•„๋‹ˆ์š”, ๋ฌธ์ œ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ์ž˜๋ชป๋œ ๊ธฐ๋Šฅ์„ ์ฐธ์กฐํ•œ ๊ฒƒ๋ฟ์ž…๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์— ์˜ค๋ฅ˜๊ฐ€ ์ƒ์„ฑ ๋œ SQL์— ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์ด๋ฆ„๊ณผ์„ฑ์— concat์„ ์‚ฌ์šฉํ•˜์ง€๋งŒ ๊ณต๋ฐฑ์ด ์•„๋‹Œ - ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ตฌ๋ถ„ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๊ฒŒ ๋ฌธ์ œ์˜ ์›์ธ์ผ๊นŒ์š”?

์•„์ง ์ „์ฒด ์ด๋ฆ„์„ ์ฐพ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค :(

์ƒ์„ฑ ๋œ ์ฟผ๋ฆฌ๋ฅผ ๋””๋ฒ„๊ทธํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ํฌ๋กฌ ๊ฐœ๋ฐœ ๋„๊ตฌ ๋˜๋Š” ๋ฐฉํ™”๋ฒ”์„ ์‚ฌ์šฉํ•˜๊ณ  ์ƒ์„ฑ ๋œ SQL์„ ๊ฒ€์‚ฌํ•ฉ๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์— concat์„ ์ถ”๊ฐ€ํ•ด์•ผํ•ฉ๋‹ˆ๊นŒ?

$users = User::where(['type'=>$type])->whereHas('roles', function ($query) {
            $query->where('slug', '=', 'user');
        })->get();

์•„, ->get(); ๋ฅผ ์ œ๊ฑฐํ•˜๊ณ  ํŒจํ‚ค์ง€๊ฐ€ SQL ์ˆ˜์ค€์—์„œ ํŽ˜์ด์ง€ ๋งค๊น€์„ ์ˆ˜ํ–‰ํ•˜๋„๋กํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค์— ํ˜•์ œ์ด๊ธฐ ๋•Œ๋ฌธ์— ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค :(

->get() ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ด์ œ ์›…๋ณ€ ๋Œ€์‹  ์ปฌ๋ ‰์…˜์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  filterColumn์€ Collection ์— ์ ์šฉ๋˜์ง€ ์•Š๋Š”๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ฟผ๋ฆฌ์—์„œ get์„ ์ œ๊ฑฐํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ฐพ์•„์•ผํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ๊ฒ€์ƒ‰์ด ์‹คํŒจํ•˜๋Š” ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.

๋งˆ์ง€๋ง‰์œผ๋กœ ํ•ด๊ฒฐ๋˜๋ฉด ์ปจํŠธ๋กค๋Ÿฌ์™€ ๋ฐ์ดํ„ฐ ํ…Œ์ด๋ธ”์˜ ์ฟผ๋ฆฌ๋ฅผ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ˆ˜์ •ํ•ฉ๋‹ˆ๋‹ค.

$("#datatable").DataTable({
            processing: true,
            serverSide: true,
            "order": [[ 1, "asc" ]],
            ajax: "{!! route('admin.customers.getdata','Umum') !!}",
            columns: [
                { data: null, bSortable: false, className: "text-center" },
                { data: "id" },
                { data: "name", name: "full_name" },
                { data: "type" },
                { data: "email" },
                { data: "location" },
                { data: "active", bSortable: false, className: "text-center" },
                { data: "free_ongkir", bSortable: false, className: "text-center" },
                { data: "action", bSortable: false, className: "text-center" }
            ],
            fnRowCallback: function(nRow, aData, iDisplayIndex){
                $("td:first", nRow).html(iDisplayIndex +1);
                return nRow;
            }
        });

์ปจํŠธ๋กค๋Ÿฌ :

{
        $users = User::select('id','email','first_name','last_name','city_id', 'is_approved','type', DB::raw("CONCAT(first_name,' ',last_name) as full_name"))->where(['type'=>$type])->whereHas('roles', function ($query) {
            $query->where('slug', '=', 'user');
        })->get();
        foreach ($users as $key => $value) {
            if($value->id == Sentinel::getUser()->id) $value->disabled = "disabled";
            else$value->disabled = "";
        }
        return Datatables::of($users)
        ->editColumn('name', '
            <a href="{{ route(\'admin.customers.show\', $id) }}">{!! $first_name." ".$last_name !!}</a>
        ')
        ->editColumn('type', function($users) {
            if($users->hasAccess('superadmin')) return 'Super Admin';
            else return "Komoditi $users->type";
        })
        ->editColumn('active', function($users) {
            if(!$users->is_approved) {
                return '<span class="has-error form-group"><label><i class="fa fa-times-circle-o"></i> Belum di approve</label></span>';
            } else if(Activation::completed($users)) {
                return '<span class="has-success form-group"><label><i class="fa fa-check"></i> Aktif</label></span>';
            } else {
                return '<span class="has-error form-group"><label><i class="fa fa-times-circle-o"></i> Belum Aktivasi</label></span>';
            }
        })
        ->editColumn('free_ongkir', function($users) {
          if ($users->free_ongkir == 1) {
            return '<span class="has-success form-group"><label><i class="fa fa-check"></i></label></span>';
          }else {
            return '<span class="has-error form-group"><label><i class="fa fa-times-circle-o"></i></label></span>';
          }
        })
        ->editColumn('location', function($users){
            if(empty($users->city->name)) return 'None';
            else return $users->city->name;
        })
        ->addColumn('action', '@if(Sentinel::getUser()->hasAccess(["customers.edit"]))<button class="btn btn-primary" type="button" onClick="location.href=\'{{ route(\'admin.customers.edit\', $id) }}\'"><i class="fa fa-edit"></i></button>
            <strong i="9">@endif</strong>
            {!! Form::open([
                \'method\'=>\'DELETE\',
                \'route\' => [\'admin.customers.destroy\', $id],
                \'style\' => \'display:inline\'
            ]) !!}
            @if(Sentinel::getUser()->hasAccess(["customers.destroy"]))
                {!! Form::button(\'<i class="fa fa-trash"></i>\', [\'class\' => \'btn btn-danger btn-md\',\'type\'=>\'submit\',\'onclick\'=>\'return confirm("Are you sure want to delete?")\', $disabled]) !!}
             <strong i="10">@endif</strong>
            {!! Form::close() !!}

        ')
        ->make(true);
    }

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

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰