أولاً ، عمل رائع لهذه الحزمة الرائعة.
لدي مشكلة صغيرة:
أضفت عمود مخصص جديد في ملف العرض الخاص بك: ... / بليغ / إضافة تحرير-إزالة عمود، أريد أن بحث / فلتر لهذا العمود، ولكن أحصل على خطأ في المتصفح عندما مدخلات كل شيء.
هل هناك حل للبحث / فلتر في عمود مخصص وبعد ذلك لإضافة إدخال النص البحث عن كل عمود في الجدول، بما في ذلك custom_column؟
خطأ في وحدة تحكم FireBug:
<span class="exception_message">SQLSTATE[42S22]: Column not found: 1054 Champ
'new_column' inconnu dans where clause (SQL: select count(*) as aggregate from (select '
;1' 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 الذي تم إنشاؤه يعمل وأنه يجب أن يعمل مع الحزمة أيضًا.
يجب أن يؤدي الإغلاق بسبب عدم النشاط والحل البديل المقترح أعلاه إلى إصلاح المشكلة. شكرا!
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 ونجعلها غير مرئية ولكن قابلة للبحث؟
بعض الطرق التي يمكنني التفكير بها:
{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" },
]
});
استثناء: عند محاولة البحث أو الفرز:
كما اتضح أن المشكلة مع هذا الاستثناء كانت خطأي ؛ كانت لدي علامة "$$" مزدوجة ضمن طريقة filterColumn الخاصة بي.
هذا لم يصلح مشكلة الفرز الخاصة بي رغم ذلك. ما زلت بحاجة إلى معرفة:
@ seewhy17 يمكنك استخدام orderColumn للفرز المعقد. ومع ذلك ، في حالتك ، فإن الطلب بواسطة fullname
سيعمل بالفعل خارج منطقة الجزاء afaik.
@ seewhy17 يمكنك استخدام orderColumn للفرز المعقد. ومع ذلك ، في حالتك ، فإن الطلب بواسطة
fullname
سيعمل بالفعل خارج منطقة الجزاء afaik.
حسنًا ، لم يحدث ذلك ، أعتقد أن طريقة filterColumn تتعارض مع مقيم في النموذج الذي يقوم بنفس الشيء في الأساس ... لا أعرف حقًا.
لمعرفتي ، حصلت عليه نوعًا من العمل عن طريق إضافة name: lastname
إلى js ، لذلك فهو يقوم بالتصفية حسب اسم العائلة وطريقة filterColumn زائدة عن الحاجة
التعليق الأكثر فائدة
marioene ، لا يمكنك البحث على
addColumn
إذا لم تكن البيانات من قاعدة البيانات. الحل البديل لذلك هو إضافة العمود في بيان التحديد الخاص بك كما هو موضح أدناه. لا حاجة لاستخدامaddColumn
.