Laravel-datatables: как искать в столбце, созданном addColumn?

Созданный на 3 авг. 2015  ·  22Комментарии  ·  Источник: yajra/laravel-datatables

Во-первых, отличная работа для этого потрясающего пакета.

У меня небольшая проблема:

Я добавил новый настраиваемый столбец в ваш демонстрационный файл: ... / eloquent / add-edit-remove-column, я хочу найти / отфильтровать этот столбец, но при вводе всего получаю сообщение об ошибке в браузере.

Есть ли решение для поиска / фильтрации в настраиваемом столбце и после этого для добавления текста ввода поиска для каждого столбца в таблице, в том числе для 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)
    }

Код из 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 работает и должен работать с пакетом.

Все 22 Комментарий

@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 и сделать невидимым, но доступным для поиска?

Некоторые способы, о которых я могу думать:

  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');
    }

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" },
          ]
        });

Исключение: при попытке поиска или сортировки:

yajraIssue

как оказалось, проблема с этим исключением была моя вина; У меня был двойной знак «$$» в моем методе filterColumn.
yajra_issue_fix_1

Однако это не устранило мою проблему с сортировкой. Мне все еще нужно знать:

  1. как сделать столбец доступным для сортировки
  2. как искать и сортировать связанные столбцы еще один взгляд на документы очистил это для моего варианта использования

@ seewhy17 вы можете использовать orderColumn для сложной сортировки. Однако в вашем случае заказ по fullname уже будет работать из коробки afaik.

@ seewhy17 вы можете использовать orderColumn для сложной сортировки. Однако в вашем случае заказ по fullname уже будет работать из коробки afaik.

Ну, это не так, я предполагаю, что метод filterColumn конфликтует с Assessor в модели, который в основном делает то же самое ... Я действительно не знаю.
Знаете, я получил его для работы, добавив name: lastname в js, поэтому он фильтрует по фамилии, а метод filterColumn является избыточным

Была ли эта страница полезной?
0 / 5 - 0 рейтинги