Laravel-datatables: yajra Datatables وظيفة البحث السريع لا تبحث

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

يوم جيد!

أواجه مشكلة في البحث عن السجلات في جداول البيانات الخاصة بي. يمكن البحث في عمود tracking_id فقط. أريد البحث في جميع الأعمدة.

هنا هو كود الاستفسار الخاص بي php:

$result = Document::join('user','document.user_id','=','user.id')
->join('classification','document.classification_id','=','classification.id')
->select('document.id',DB::raw('CONCAT(document.tracking_type,"-",document.tracking_date,"-",document.tracking_seq_no) AS tracking_id'),'document.date_prepared','document.subject','classification.description as doc_class')
->orderBy('document.created_at','desc')->get();

return Datatables::collection($result)
->addColumn('check',function($record){
    return '<input type="checkbox" name="check['.$record->id.']" class="checkboxes" value='.$record->id.'>';})
->addColumn('action',function($record){
    return '<a href="/records/view/' . $record->tracking_id . '">View Record</a></a>';})
->addColumn('document.tracking_id',function($record){
    return $record->tracking_id;})
->editColumn('document.doc_class',function($record){
    return $record->doc_class;})
->addColumn('document.subject',function($record){
    return $record->subject;})
->addColumn('document.date_prepared',function($record){
    return date('F d, Y', strtotime($record->date_prepared));})
->make(true);

إعلان JS:

docstable = $('.docstable').DataTable({
    processing: true,
    serverSide: true,
    ajax: "/ajax/docrec"
    columnDefs: [
        {targets:[0,1], orderable:false}
    ],
    columns: [
        {data:'check'},
        {data:'action'},
        {data:'tracking_id',name:'document.tracking_id'},
        {data:'doc_class',name:'document.doc_class'},
        {data:'subject',name:'document.subject'},
        {data:'date_prepared',name:'document.date_prepared'}
    ]
});

هل هناك طريقة مثل Bllim Datatables يمكنها البحث في جميع الأعمدة المحددة باستخدام searchColumns () في كود php؟ شكرا جزيلا

question

التعليق الأكثر فائدة

مرحبًا ChaosPower وشكراً جزيلاً على إجابتك.

لقد جربت الحل الخاص بك لكنه لم ينجح. في الواقع ، $this->mainRepo->model هو مثيل نموذجي ، من App \ Models. إنه مرتبط بأشياء Repo الرئيسية ولكنه لا يتعلق بمشكلتي.
لقد قمت بالتحديث للحصول على شيء مثل هذا (من مستودعي):
$query = $this->model->with($with);
$dataTable ?: $query->orderBy($orderBy, $sort);
return !$dataTable ? $query->get($columns) : $query->select($columns);

أستخدم هذه الطريقة لإدارة جميع بيانات DataTables من النماذج الخاصة بي. إذا كان متغير dataTable خاطئًا ، فلن يتم تطبيق أي أمر ، وأستخدم select('*') .

في النهاية ، قد تبدو الطريقة المتسلسلة كما يلي:
$this->model->with('relation')->select('*'); حيث $this->model هو App\Models\User .

يعمل ترتيب الأعمدة الآن بشكل مثالي ، لكن البحث الافتراضي عن النص ليس له أي تأثير على البحث. يتم عرض جميع النتائج لا بناءً على مدخلاتي.
هل فعلت شيئا خاطئا مرة أخرى؟

نرى هنا مدخلات البحث الخاصة بي ، ولكن تم إرجاع جميع المستخدمين الثلاثة ، حتى إذا كان إدخال "قيمة البحث الخاصة بي" يجب ألا يُرجع أي شيء على الإطلاق.
capture

شكرا جزيلا لمساعدتكم

ال 17 كومينتر

يتم دعم البحث السريع في جميع الأعمدة بشكل افتراضي ولكن نظرًا لأنك تستخدم استعلامات الانضمام ، فهناك بعض التغييرات حول كيفية إعلان الاسم في البرنامج النصي الخاص بك كما هو الحال في هذا العرض التوضيحي .

راجع للشغل ، لماذا نستخدم التجميع بدلاً من البليغ؟ أقترح عليك إزالة get() استعلامك واستخدام return Datatables::eloquent($result) بدلاً من ذلك؟

مرحبا !
بالنسبة لي ، فإن البحث العالمي يعرض دائمًا نتيجة فارغة. جدول البيانات الخاص بي فارغ بعد البحث. تمتلئ بجميع البيانات عندما أقوم بإزالة جميع مدخلات البحث.
لكني أفعل ذلك بهذه البساطة:
$users = $this->mainRepo->model->get(); return Datatables::of($users)->make(true);

أستطيع أن أرى في طلب HTTP إدخال البحث الخاص بي ، لكن نتيجة الصف فارغة دائمًا. هل أحتاج إلى القيام بشيء ما من جانب الخادم للسماح بخيارات البحث العالمية؟ اعتقدت أنها كانت تلقائية ...
capture

Datas قادمة من المستودع الخاص بي وهي تقوم بشكل أساسي بعمل نموذج $-> get () دون أي ترتيب / فرز. اعتقدت أنه كان كافياً لإجراء بعض تصفية النص العام والعمودي. لكن هل أحتاج إلى تنفيذ حل لاستخدام "أين" في طلب Eloquent الخاص بي؟ أم أنه من الأفضل التصفية باستخدام طريقة مرشح DataTables؟ (في حالة عدم وجود شيء تلقائي ، وأحتاج إلى القيام بكل شيء من جانب الخادم).

ولكن هذا المثال و هذا واحد لا تنفيذ أية معالجة من جانب الخادم، والحصول على البحث العالمي، حتى في البحث العمود ... حاولت كل تلك الأمثلة، ولكن دون جدوى: نتيجة البحث فارغ دائما أو DataTable فارغة في حرف البحث الأول إرسال ، وإعادة ملئها بجميع البيانات عندما لا يتم ملء أي فلتر على الإطلاق ...

الأسئلة الأساسية هي: هل هناك أي شيء تم تنفيذه في الحزمة للتصفية / البحث من جانب الخادم من Model Datas ، أم أن هناك فقط فرز الأعمدة وتقسيم الصفحات المتاح؟

شكرا جزيلا لقراءتك ومساعدتك!

ملاحظة: مرتبط بتعليقي # 562

@ mtx-z عندما تستدعي -> get () فأنت تستخدم المجموعات بدلاً من كائن LDT.

$users = User::select(['id', 'name', 'email', 'password', 'created_at', 'updated_at']); //Eloquent Object

$users->all(); // Collection

تقوم Laravel Datatables تلقائيًا -> الحصول على () وأنا أنصح بعدم استخدام -> الحصول على () عندما

return Datatables::of($users)->make(true);

بناءً على مثالك ، لا تحتاج -> الحصول على ()


$users = $this->mainRepo->model->get(); return Datatables::of($users)->make(true);

مجرد


$users = $this->mainRepo->model; return Datatables::of($users)->make(true);

لسؤالك الرئيسي بخصوص التصفية والبحث. تنفذ Laravel Datatables بالفعل البحث في جميع الأعمدة عن طريق المعالجة الافتراضية / جانب الخادم. كما يدعم تصفية العمود الفردي.

https://datatables.yajrabox.com/eloquent/basic - انظر العناوين المرسلة
https://datatables.yajrabox.com/eloquent/multi-filter-select - انظر العناوين المرسلة

مرحبًا ChaosPower وشكراً جزيلاً على إجابتك.

لقد جربت الحل الخاص بك لكنه لم ينجح. في الواقع ، $this->mainRepo->model هو مثيل نموذجي ، من App \ Models. إنه مرتبط بأشياء Repo الرئيسية ولكنه لا يتعلق بمشكلتي.
لقد قمت بالتحديث للحصول على شيء مثل هذا (من مستودعي):
$query = $this->model->with($with);
$dataTable ?: $query->orderBy($orderBy, $sort);
return !$dataTable ? $query->get($columns) : $query->select($columns);

أستخدم هذه الطريقة لإدارة جميع بيانات DataTables من النماذج الخاصة بي. إذا كان متغير dataTable خاطئًا ، فلن يتم تطبيق أي أمر ، وأستخدم select('*') .

في النهاية ، قد تبدو الطريقة المتسلسلة كما يلي:
$this->model->with('relation')->select('*'); حيث $this->model هو App\Models\User .

يعمل ترتيب الأعمدة الآن بشكل مثالي ، لكن البحث الافتراضي عن النص ليس له أي تأثير على البحث. يتم عرض جميع النتائج لا بناءً على مدخلاتي.
هل فعلت شيئا خاطئا مرة أخرى؟

نرى هنا مدخلات البحث الخاصة بي ، ولكن تم إرجاع جميع المستخدمين الثلاثة ، حتى إذا كان إدخال "قيمة البحث الخاصة بي" يجب ألا يُرجع أي شيء على الإطلاق.
capture

شكرا جزيلا لمساعدتكم

لقد فعلتها أخيرًا :) ty

أنا أيضًا لا أستطيع فجأة البحث عن العلاقة ، لقد استخدمت $ this-> model-> with ('rel ') -> select (' * ')؛
mtx-z هل يمكنك مشاركة الحل؟

مهلا. الكود الذي استخدمته كان خاصًا بي.
يحتوي هذا النموذج> على مثيل لنموذجي.

هل يمكنك تقديم الرمز الخاص بك؟

\\ In controller
$result = MsCustomer::with('company')->select('ms_customers.*');
return Datatables::of($result)->make(true);

\\ In view
$('#data-table').DataTable({
    ajax: '{!! route('master.customer.data') !!}',
    columns: [
        { data: 'id', name: 'id' },
        { data: 'code', name: 'code' },
        { data: 'name', name: 'name' },
        { data: 'email', name: 'email' },
        { data: 'company.name', name: 'company.name' },
   ]
});

تتضمن بيانات تشغيل جداول البيانات وعرضها العلاقة company.name ، لكن لا يمكن البحث في العلاقة. أعتقد أن الكود مشابه بالفعل مثل هذا العرض التوضيحي

لدي نموذج MsCustomer مع إعلان $ table محمي = 'ms_customers' ، وكذلك علاقة 'company' داخل نموذج MsCustomer. ثم نموذج MsCompany مع اسم الجدول "ms_companies".

يمكنني البحث عن المعرف والرمز والاسم والبريد الإلكتروني ، ولكن لا يمكنني البحث عن "اسم الشركة". هل هناك شيء خاطئ في الكود أعلاه؟

لدي نفس المشكلة مع maengkom ، تم تحميل

في تحكم

$agenda = AgendaMasuk::with('surat')
            ->whereNotNull('surat_id')->where('group_id', $group->id)
            ->select('agenda_masuks.*');
        return Datatables::of($agenda)->make(true);

في رؤيه

var table = $('#surats').DataTable({
        "jQueryUI"   : true,
        "paging"     : true,
        "lengthMenu" : [ 5, 10, 25, 50, 75, 100, "All" ],
        "autoWidth"  : false,
        "stateSave"  : false,
        "order"      : [[ 0, 'asc' ]],
        "processing" : true,
        "scrollX"    : true,
        "serverSide" : true,
        "ajax": {
            "url": $('#surats').data('url'),
            "type": "POST"
        },
        "columns": [
            {
                className: 'text-center',
                data: 'no_agenda',
                name: 'agenda_masuks.no_agenda'
            },
            {
                className: 'text-center',
                data: 'surat.no_surat',
                name: 'surat.no_surat'
            },
            {
                className: 'text-center',
                data: 'tanggal',
                name: 'agenda_masuks.tanggal'
            },
            {
                data: 'surat.sifat',
                name: 'surat.sifat',
                sortable: false
            },
            {
                data: 'surat.pengirim',
                name: 'surat.pengirim'
            },
            {
                data: 'surat.tujuan',
                name: 'surat.tujuan'
            },
            {
                data: 'surat.ringkasan',
                name: 'surat.ringkasan',
                sortable: false
            },
            {
                data: null,
                defaultContent: '-',
                name: 'disposisi',
                searchable: false,
                sortable: false
            },
            {
                data: null,
                defaultContent: '-',
                name: 'file',
                searchable: false,
                sortable: false
            }
        ]
    });

maengkom لدي نفس المشكلة ، لم أتمكن من استخدام البحث العالمي عن قيم الكائن وقيم العلاقة (فقط المعرف).
على سبيل المثال ، جميع نماذجي مرتبطة بـ "translation_model". التي تحتوي على النص العام فقط. حسنًا ، لا يمكن لجدول البيانات الخاص بي البحث تلقائيًا عن اسم الترجمات.

لإصلاح ذلك ، قمت بتحرير استدعاء ajax لإضافة بعض المعلمات (بحث نصي ، حدد قيمة ...) وأستخدم هذه القيم لتصفية الاستعلام البليغ قبل إرساله إلى Datatable.
من هنا ، يمكنك التصفية على أي شيء (بالنسبة للحالة الفعلية ، إنه "أين" مع "بينما الترجمة" حيث "translations.name = 'search_value'" لأنها بليغة.

nsetyo هل راجعت المجموعة التي تم إرجاعها؟ هل تتطابق البيانات الموجودة في المجموعة مع احتياجات جدول البيانات؟

@ mtx-z نعم يفعل ذلك. أقوم بإصلاح هذا مؤقتًا باستخدام استعلامات الانضمام بدلاً من ذلك

nsetyo @ mtx-z أكد المالك بالفعل أن علاقة البحث لا تزال بها خطأ. تحقق من ذلك https://github.com/yajra/laravel-datatables/issues/698

أحاول المساعدة في إصلاحه وما زلت أتعلم الكود في طريقة التصفية داخل الحزمة ولكن ما زلت أخلط بين المكان الذي يجب إصلاحه 😆

جميع حقول البحث الخاصة بي تعمل الآن ولكن لدي مشكلة واحدة متبقية. بناءً على العرض التوضيحي المقدم من yajra (المالك) ، يوجد حقل Created At & Updates At في الجدول. لدي أيضًا حقل في جدولي يعرض التاريخ والوقت ، لكن الشيء هو ، إذا قمت بتنسيق التاريخ والوقت المعروضين بحيث يكون قابلاً للقراءة كثيرًا للمستخدمين ، فلن يتمكن جدول البيانات من البحث في التاريخ والوقت المنسقين حديثًا.

مثال: (عرض تنسيق التاريخ والوقت الافتراضي)
2016-08-23 14:37:25

لقد قمت بتنسيق ذلك إلى:
23 أغسطس 2016 02:37:25 مساءً

باستخدام date('F d, Y h:i:s a',strtotime($the_given_date_and_time));

بعد التنسيق ، لم يتمكن جدول البيانات من البحث في هذا الحقل

يمكنك استخدام filterColumn api لتجاوز sql الافتراضي للبحث في عمود التاريخ لمطابقة ما تم عرضه.

بالنسبة إلى addcolumn ، يجب أن يكون قابلاً للبحث.

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات