Laravel-datatables: كيف تبحث في عمود تم إنشاؤه بواسطة addColumn؟

تم إنشاؤها على ٣ أغسطس ٢٠١٥  ·  22تعليقات  ·  مصدر: yajra/laravel-datatables

أولاً ، عمل رائع لهذه الحزمة الرائعة.

لدي مشكلة صغيرة:

أضفت عمود مخصص جديد في ملف العرض الخاص بك: ... / بليغ / إضافة تحرير-إزالة عمود، أريد أن بحث / فلتر لهذا العمود، ولكن أحصل على خطأ في المتصفح عندما مدخلات كل شيء.

هل هناك حل للبحث / فلتر في عمود مخصص وبعد ذلك لإضافة إدخال النص البحث عن كل عمود في الجدول، بما في ذلك custom_column؟

خطأ في وحدة تحكم FireBug:

  <span class="exception_message">SQLSTATE[42S22]: Column not found: 1054 Champ
 &#039;new_column&#039; inconnu dans where clause (SQL: select count(*) as aggregate from (select &#039
;1&#039; as row_count from `users` where (LOWER(`id`) LIKE %b% or LOWER(`name`) LIKE %b% or LOWER(`email
`) LIKE %b% or LOWER(`created_at`) LIKE %b% or LOWER(`updated_at`) LIKE %b% or LOWER(`new_column`) LIKE
 %b%)) count_row_table)</span>

رمز من المراقب:

    public function getAddEditRemoveColumnData()
    {
        $users = User::select(['id', 'name', 'email', 'password', 'created_at', 'updated_at']);

        return Datatables::of($users)
                                 ->addColumn('new_column' , 'ABC')
                                  ->make(true)
    }

كود من جافا سكريبت:

    $('#users-table').DataTable({
        processing: true,
        serverSide: true,
        ajax: '{{ url("eloquent/add-edit-remove-column-data") }}',
        columns: [
            {data: 'id', name: 'id'},
            {data: 'name', name: 'name'},
            {data: 'email', name: 'email'},
            {data: 'created_at', name: 'created_at'},
            {data: 'updated_at', name: 'updated_at'},
            {data: 'new_column', custom: 'new_column', orderable: true, searchable: true}
        ]
    });

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

marioene ، لا يمكنك البحث على addColumn إذا لم تكن البيانات من قاعدة البيانات. الحل البديل لذلك هو إضافة العمود في بيان التحديد الخاص بك كما هو موضح أدناه. لا حاجة لاستخدام addColumn .

$users = User::select([
'id', 'name', 'email', 'password', 'created_at', 'updated_at',
DB::raw("'ABC' as new_column")
]);

ملاحظة: قد تضطر إلى كتابة filterColumn مخصص حتى يعمل. فقط تأكد من أن SQL الذي تم إنشاؤه يعمل وأنه يجب أن يعمل مع الحزمة أيضًا.

ال 22 كومينتر

marioene ، لا يمكنك البحث على addColumn إذا لم تكن البيانات من قاعدة البيانات. الحل البديل لذلك هو إضافة العمود في بيان التحديد الخاص بك كما هو موضح أدناه. لا حاجة لاستخدام addColumn .

$users = User::select([
'id', 'name', 'email', 'password', 'created_at', 'updated_at',
DB::raw("'ABC' as new_column")
]);

ملاحظة: قد تضطر إلى كتابة filterColumn مخصص حتى يعمل. فقط تأكد من أن SQL الذي تم إنشاؤه يعمل وأنه يجب أن يعمل مع الحزمة أيضًا.

يجب أن يؤدي الإغلاق بسبب عدم النشاط والحل البديل المقترح أعلاه إلى إصلاح المشكلة. شكرا!

yajra لقد اتبعت اقتراحك بإضافة عمود محسوب أولاً باستخدام "تحديد" (في وحدة التحكم)

$staffData = Staff::select('id', 'staff_id', \DB::raw('concat(first_name, " ", middle_name, " ", last_name) as full_name'), 'department_name', 'status');

ثم أضفت مرشحًا مخصصًا (في وحدة التحكم)

$dt = Datatables::of($staffData);
return $dt->filterColumn('full_name', function($query, $keyword) {
            $query->whereRaw("CONCAT(first_name, ' ', middle_name, ' ', last_name) like ?", ["%{$keyword}%"]);
        })->make(true);

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

Ajax error. http://datatables.net/tn/7

هل يمكنك السماح لي بمعرفة أين قد أرتكب خطأ.

@ AshishGupta001 حاول فحص طلب ajax باستخدام أدوات chrome dev أو firebug. سيعطيك تلميحًا حول سبب المشكلة. على الأرجح ، مشكلة استثناء SQL.

yajara شكرا
أثناء تنفيذ البحث الشامل عن عمود "محسوب" (في حالتي "full_name") أشرت إلى
1) العدد 168: https://github.com/yajra/laravel-datatables/issues/168
2) مثال: https://datatables.yajrabox.com/eloquent/post-column-search

قبل أن أضيف "filterColumn ()" المخصص لجدول البيانات الخاص بي ، كنت أتلقى استثناء SQL يشكو من عدم وجود العمود "full_name" في الجدول. ثم أضفت الكود أدناه لإضافة عامل تصفية مخصص للعمود "المحسوب" (في حالتي "full_name") على النحو التالي

$dt->filterColumn('full_name', function($query, $keyword) {
       $query->whereRaw("CONCAT(staff.first_name, ' ', staff.middle_name, ' ', staff.last_name) like ?", ["%{$keyword}%"]);
});

return $dt->make(true);

الآن أحصل على الخطأ التالي في السجل

mb_strtolower() expects parameter 1 to be string, object given في الملف ......./vendor/laravel/framework/src/Illuminate/Support/Str.php#162

نقدر ما إذا كان يمكنك المساعدة في تصحيح هذه المشكلة.

@ AshishGupta001 ما هو الإصدار الذي تستخدمه؟ كودك يبدو جيدا بالنسبة لي

yajra شكرا على التأكيد. الإصدارات أدناه

PHP - 5.5.38-3
Laravel - 5.0.34
جداول البيانات - yajra / laravel-datatables-oracle: ^ 6.3 (كما في composer.json)

يبدو أنه في 'getOrMethod' في فئة المساعد ، يتم طرح استثناء أثناء محاولة التحويل إلى تقليل "clouser" الذي تم تمريره كمعلمة إدخال.

public static function getOrMethod($method) {
   if (! Str::contains(Str::lower($method), 'or')) {
      return 'or' . ucfirst($method);
   }
      return $method;
}

'طريقة $' هو clouser كما تم تمرير function($query, $keyword) ، على النحو التالي

Closure {#864
  reflection: """
    Closure [ <user> public method App\Http\Controllers\{closure} ] {\n
      @@ /var/www/html/XYZ/app/Http/Controllers/StaffHistoryController.php 310 - 313\n
    \n
      - Parameters [2] {\n
        Parameter #0 [ <required> $query ]\n
        Parameter #1 [ <required> $keyword ]\n
      }\n
    }\n
    """
}

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

عرض: احصل على ما يلي في العرض داخل علامة البرنامج النصي

{ data: 'full_name', name: 'full_name', searchable: false },
{ data: 'first_name', name: 'first_name', searchable: true, visible: false },
{ data: 'middle_name', name: 'middle_name', searchable: true, visible: false },
{ data: 'last_name', name: 'last_name', searchable: true, visible: false }

وحدة التحكم: قم بإحضار اسم_الأول وما إلى ذلك في استعلام SQL مع باقي قيم العمود.

@ AshishGupta001 سعيد لأنك اكتشفت ذلك. هذا ما اعتدت فعله أيضًا منذ إصدار Laravel 4.2. 👍

@ AshishGupta001 حل جيد!

yajra هل يمكننا البحث في عمود مضاف باستخدام addColumn الذي تأتي بياناته من قاعدة البيانات ولكننا لا نضيف هذا العمود في JS؟

أم يجب أن نضيفها إلى JS ونجعلها غير مرئية ولكن قابلة للبحث؟

بعض الطرق التي يمكنني التفكير بها:

  1. أضفه إلى js واجعله غير مرئي وقابل للبحث كما قلت.
  2. استخدم filterColumn للتعامل يدويًا مع البحث عن العمود المضاف.
  3. أعلنها بهذه الطريقة:
{data: 'added_column', name: 'actual_column_name'}

شكرا لاستجابتك السريعة yajra

كنت أحاول بالفعل الحل الثاني ولكني لاحظت أن هذا العمود المضاف لا يتم اعتباره في الاستعلام.

أي أفكار ؟

تأكد من أنك لم تقم بإضافة searchable: false في هذا العمود.

هذه هي الطريقة التي أضفت بها العمود ->addColumn('company_name', function($deal) { return $deal->company_name; })

واستعلام البحث العام $dataTable->filterColumn('company_name', 'where', "like", ["%$keyword%"]);

هل يمكننا تمرير searchable: false في الواجهة الخلفية؟

searchable: false موجود في js من جانب العميل.

راجع للشغل ، ما هو الإصدار الذي تستخدمه؟

آه طيب. لذلك ما زلنا بحاجة إلى استخدام الطريقة الأولى التي ذكرتها بهذه الطريقة.
أنا أستخدم v6.17.0

أواجه نفس المشكلة مثل @ AshishGupta001 لسوء الحظ ، فإن خدعة جانب العميل لا تقطعها لأن العمود غير قابل للفرز.
لقد قمت باستكشاف بديل filterColumn ولكن لم أتمكن من تشغيله أيضًا.
باستخدام "yajra / laravel-datatables-oracle": "~ 9.0"

طريقة تحكم:

    public function getAccounts(Request $request)
    {
        if ($request->ajax()) {
            $accounts = Account::with('current_marketer')->select([
                '*',
                DB::raw("CONCAT(accounts.lastname,' ',accounts.firstname) as fullname"),
            ]);
            return Datatables::of(Account::query()->with('current_marketer'))
            ->addColumn('marketer', function(Account $account){
                return $account->current_marketer->name;
            })
            ->addColumn('fullname', function($account){
                return '<a href="'.route('account.clients.show', $account->account_number).'" class="hover:underline" target="_blank">'. $account->fullname.'</a>';
            })
            ->filterColumn('fullname', function($query, $keyword) {
                $sql = "CONCAT(accounts.lastname,' ',accounts.firstname)  like ?";
                $$query->whereRaw($sql, ["%{$keyword}%"]);
            })
            ->rawColumns(['fullname'])
            ->editColumn('created_on', function(Account $account) {
                return Carbon::parse($account->created_on)->format('jS F, Y');
            })
            ->toJson();
        }
        return view('datatables.accounts.index');
    }

شفرة شبيبة:

 $('#accounts-table').DataTable({
          "processing": true,
          "serverSide": true,
          "ajax": '{{ route('accounts.get') }}',
          "columns": [
            { data: "id" },
            { data: "account_number" },
            { data: 'fullname'},
            { data: "marketer" },
            { data: "created_on" },
          ]
        });

استثناء: عند محاولة البحث أو الفرز:

yajraIssue

كما اتضح أن المشكلة مع هذا الاستثناء كانت خطأي ؛ كانت لدي علامة "$$" مزدوجة ضمن طريقة filterColumn الخاصة بي.
yajra_issue_fix_1

هذا لم يصلح مشكلة الفرز الخاصة بي رغم ذلك. ما زلت بحاجة إلى معرفة:

  1. كيفية جعل العمود قابل للفرز
  2. كيفية البحث وفرز الأعمدة ذات الصلة نظرة أخرى على المستندات مسح هذا لحالة الاستخدام الخاصة بي

@ seewhy17 يمكنك استخدام orderColumn للفرز المعقد. ومع ذلك ، في حالتك ، فإن الطلب بواسطة fullname سيعمل بالفعل خارج منطقة الجزاء afaik.

@ seewhy17 يمكنك استخدام orderColumn للفرز المعقد. ومع ذلك ، في حالتك ، فإن الطلب بواسطة fullname سيعمل بالفعل خارج منطقة الجزاء afaik.

حسنًا ، لم يحدث ذلك ، أعتقد أن طريقة filterColumn تتعارض مع مقيم في النموذج الذي يقوم بنفس الشيء في الأساس ... لا أعرف حقًا.
لمعرفتي ، حصلت عليه نوعًا من العمل عن طريق إضافة name: lastname إلى js ، لذلك فهو يقوم بالتصفية حسب اسم العائلة وطريقة filterColumn زائدة عن الحاجة

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

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

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

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

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

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

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