Сортировка в Yajrabox по данным с помощью поля доступа Eloquent - PullRequest
1 голос
/ 13 июня 2019

У меня есть таблица пользователей с полями first_name и last_name и метод доступа getFullNameAttribute, который я отображаю в виде интерактивной таблицы с использованием таблицы данных Yajrabox.Я могу правильно отобразить таблицу с помощью метода доступа fullName, но когда я пытаюсь выполнить сортировку по полю 'fullName', на самом деле ничего не происходит.Вызов ajax выполняется, но сортировка остается прежней, и об ошибках не сообщается.Я могу сортировать по любому из других полей, и он работает нормально.Есть ли ограничение сортировки для добавленных атрибутов модели для этого пакета?Не могу найти что-нибудь на документах.

Большое спасибо!

1 Ответ

0 голосов
/ 13 июня 2019

Чтобы уточнить мой комментарий, здесь ответ.

Вы не можете использовать виртуальные свойства (например, желаемые 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 без подсказки типа в аргументах функции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...