Чтобы уточнить мой комментарий, здесь ответ.
Вы не можете использовать виртуальные свойства (например, желаемые getFullNameAttribute()
) для сортировки и фильтрации.Даже если бы он работал, он был бы выполнен в памяти, поскольку Laravel не может автоматически преобразовывать эти средства доступа в SQL.
Вместо этого вы можете заново создать желаемый метод доступа в SQL.Однако одного этого недостаточно, поскольку пакет DataTables yajra не способен сортировать по выражению, а только по имени столбца.Поэтому вам нужно будет обернуть весь запрос в другой.Пример:
class UserDataTable extends DataTable
{
public function query(): \Illuminate\Database\Query\Builder
{
return DB::query()->fromSub(
User::query()
->select([
'*',
DB::raw("CONCAT(first_name, ' ', last_name) as full_name")
]),
'wrapped'
);
}
protected function getColumns(): array
{
return [
['data' => 'first_name', 'title' => 'First Name'],
['data' => 'last_name', 'title' => 'Last Name'],
['data' => 'full_name', 'title' => 'Full Name'],
];
}
}
Имейте в виду, что перенос таблицы с DB::query()->fromSub(...)
не позволяет использовать подсказки типа в разделе фильтра:
public function dataTable($query): DataTableAbstract
{
/** @var QueryDataTable $dataTable */
$dataTable = datatables($query);
return $dataTable
->editColumn('first_name', function ($user) {
/** @var User|\stdClass $user */
return ucfirst($user->first_name);
});
}
Использование /** @var User|\stdClass $user */
- это способпо-прежнему получать поддержку IDE без подсказки типа в аргументах функции.