Во-первых, отличная работа для этого потрясающего пакета.
У меня небольшая проблема:
Я добавил новый настраиваемый столбец в ваш демонстрационный файл: ... / eloquent / add-edit-remove-column, я хочу найти / отфильтровать этот столбец, но при вводе всего получаю сообщение об ошибке в браузере.
Есть ли решение для поиска / фильтрации в настраиваемом столбце и после этого для добавления текста ввода поиска для каждого столбца в таблице, в том числе для 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)
}
Код из Javascript:
$('#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 Я последовал вашему предложению, чтобы сначала добавить вычисляемый столбец с помощью 'select' (в контроллере)
$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 попробуйте
@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' в классе Helper генерируется исключение, поскольку он пытается преобразовать, чтобы уменьшить «clouser», переданный как входной параметр.
public static function getOrMethod($method) {
if (! Str::contains(Str::lower($method), 'or')) {
return 'or' . ucfirst($method);
}
return $method;
}
'$ 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 }
Контроллер: выберите first_name и т. Д. В запросе 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');
}
Blade js:
$('#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 конфликтует с Assessor в модели, который в основном делает то же самое ... Я действительно не знаю.
Знаете, я получил его для работы, добавив name: lastname
в js, поэтому он фильтрует по фамилии, а метод filterColumn является избыточным
Самый полезный комментарий
@marioene , вы не можете искать по
addColumn
если данные не из базы данных. Чтобы решить эту проблему, добавьте столбец в оператор выбора, как показано ниже. Нет необходимости использоватьaddColumn
.