Laravel nova принадлежит к фильтру - PullRequest
0 голосов
/ 24 октября 2018

У меня один настольный чемпионат и один настольный пользователь.Также у меня есть такие же модели (чемпионат и пользователь).

В одном чемпионате может быть один главный судья, главный секретарь и оператор судьи.Все они также являются ролями в моем приложении и хранятся в таблице ролей.

Я создал новый Чемпионат по ресурсам с 3 полями принадлежащими.Все они доступны для поиска.

        BelongsTo::make('Main judge', 'mainJudge', User::class)
            ->onFormsAndDetail()
            ->searchable(),

        BelongsTo::make('Main secreatary', 'mainSecretary', User::class)
            ->onFormsAndDetail()
            ->searchable(),


        BelongsTo::make('Judge operator', 'judgeOperator', User::class)
            ->onFormsAndDetail()
            ->searchable(),

Во время поиска мне нужно отфильтровать запрос, чтобы искать только пользователей с одинаковыми ролями.

Например, во время поиска главный судья должен включитьследующий фильтр в запросе

select *
from users u
join users_roles ur on u.id = ur.user_id
join roles r on ur.role_id = r.id
where r.alias = 'judge'

Я нашел несколько методов в app / Nova / Resource.php, таких как relatableQuery , но как я могу использовать его внутри ресурса пользователя, если у меня есть 3 поля сПользователь.

Ответы [ 2 ]

0 голосов
/ 01 июля 2019

Самый простой (и неофициальный) способ добиться этого - узнать структуру URL запроса.Имея это в виду, вы можете просто переопределить метод relatableQuery в своем классе Nova/User.

Вот как это можно сделать, имейте в виду, что функция strtolower является необязательной и просто избавляет от ненужных хлопот с деломчувствительные опечатки.

public static function relatableQuery(NovaRequest $request, $query)
{
    if (strtolower($request->segment(4)) === 'mainJudge') {
        return $query->where(...);
    }

    if (strtolower($request->segment(4)) === 'mainSecretary') {
        return $query->where(...);
    }

    if (strtolower($request->segment(4)) === 'judgeOperator') {
        return $query->where(...);
    }

    return $query;
}
0 голосов
/ 25 октября 2018

на ресурсе Чемпионата вы должны создать функцию с именем отношения.

например

public static function relatableMainSecretary(NovaRequest $request, $query)
{
    return $query->where(...);
}
...