Laravel-datatables: البحث من العمود المشترك لم ينجح

تم إنشاؤها على ٣٠ مايو ٢٠١٧  ·  18تعليقات  ·  مصدر: yajra/laravel-datatables

ملخص المشكلة أو طلب الميزة


لقد استخدمت filtercolumn () لأتمكن من البحث في عدة أعمدة مثل الاسم (مدمج من الاسم الأول والاسم الأخير)
لقد قرأت العرض التوضيحي الخاص بك ولكن الاستعلام مختلف لذلك ما زلت في حيرة من أمري :(

مقتطف رمز المشكلة

$(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);
    }

تفاصيل النظام

  • نظام التشغيل: أوبونتو 16.04
  • إصدار PHP: 7.0.1
  • إصدار Laravel: 5.1.2
  • إصدار Laravel-Datatables: 6.0.1
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}%"]);
})

ولكن ما زلت لا تعمل ، حتى أنني أحاول تغيير $ query على filtercolumn إلى $ users :(

هل هناك خطأ في استعلام المستخدمين عن $؟

هل هناك أي خطأ في إرجاع رد أجاكس الخاص بك؟

لا يوجد خطأ ، فقط "لم يتم العثور على سجلات مطابقة" عند البحث عن "customer umum"
"العميل" هو الاسم_الأول على جدول المستخدمين
"umum" هو last_name في جدول المستخدمين

هل يمكنك محاولة فحص طلب ajax ولصق SQL الذي تم إنشاؤه؟ أظن أن هناك خطأ ما في SQL الخاص بك. حاول تشغيله يدويًا.

لقد أدركت للتو أنك تستخدم الإصدار v6.x وأن البحث متعدد المصطلحات لا ينطبق عليه. آسف!

"yajra / laravel-datatables-oracle": "~ 6.0" ، هذه هي المشكلة؟

لا ، ليست المشكلة ، لقد كنت أشير فقط إلى ميزة خاطئة. أعتقد أن الخطأ هنا موجود في SQL الذي تم إنشاؤه.

إنك تستخدم concat في الاسم الأول والأخير ولكن تستخدم - للفصل بين الاسمين وليس المسافة. ربما هذا هو سبب المشكلة؟

لا ، لا يزال غير قادر على العثور على الاسم الكامل :(

تحتاج إلى تصحيح الاستعلام الذي تم إنشاؤه. استخدم أدوات chrome dev أو firebug وافحص SQL الذي تم إنشاؤه.

هل يجب علي إضافة concat في هذا؟

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

أوه ، أنت بحاجة إلى إزالة ->get(); وترك الحزمة تقوم بترقيم الصفحات على مستوى sql.

لا أستطيع لأنه أشقاء لعملية أخرى :(

إذا كنت تستخدم ->get() ، فأنت الآن تستخدم التجميع بدلاً من الفصاحة. وأعتقد أن filterColumn لا ينطبق على Collection . تحتاج إلى إيجاد طريقة لإزالة الحصول على استعلامك. هذا هو سبب فشل البحث.

أخيرًا ، قمت بتعديل الاستعلام في وحدة التحكم وجدول البيانات ، مثل هذا:

$("#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 التقييمات

القضايا ذات الصلة

jgatringer picture jgatringer  ·  3تعليقات

t0n1zz picture t0n1zz  ·  3تعليقات

SGarridoDev picture SGarridoDev  ·  3تعليقات

macnux picture macnux  ·  3تعليقات

vipin733 picture vipin733  ·  3تعليقات