Месторождение Laravel Nova BelongsToMany сверлит данные - PullRequest
0 голосов
/ 08 ноября 2018

Я занимаюсь разработкой веб-приложения с использованием Laravel. Я использую Laravel Nova для создания панели администратора. Но у меня проблема с полем BelongsToMany.

У меня есть схема базы данных следующим образом

Area

Station - has area_id because an area has many stations

manager - area_id because each user belongs to an area

Area_station - station_id and manager_id (many to many)

Итак, в ресурсе Station nova я добавил следующее поле.

BelongsToMany::make('Managers', 'managers', Manager::class),

Поэтому, когда я захожу на страницу сведений о станции из админ-панели Nova и выбираю «Прикрепить менеджер», в раскрывающемся списке на следующей странице (страница, чтобы прикрепить менеджера к отделу), я вижу все доступные менеджеры. в базе данных.

Но вместо отображения всех доступных менеджеров в раскрывающемся списке мне нравится фильтровать менеджеров / пользователей, принадлежащих к той же области, что и выбранная станция. Я имею в виду, когда я прикрепил менеджера к Станции, я должен выбрать станцию. Можно ли отфильтровать или добиться того, что я хочу в Nova?

1 Ответ

0 голосов
/ 09 ноября 2018

Переопределить relatableQuery функция, которая будет определять, какие экземпляры модели могут быть присоединены к другим ресурсам, под Manager ресурсом nova.

Подход 1

public static function relatableQuery(NovaRequest $request, $query)
{
    // In case manager is get attached to another resource except Station. 
    if ($request->resource() == 'App\Nova\Station') { 
        $station = $request->findResourceOrFail();
        return $query->where('area_id', $station->area_id);
    }

    return parent::relatableQuery($request, $query);
}

Обновление

Подход 2 - Узнал что-то новое только сейчас.

Вы можете добавить соответствующий запрос для отношения под Station Новым ресурсом. В этом случае нет необходимости проверять ресурс.

public static function relatableManagers(NovaRequest $request, $query)
{
    $station = $request->findResourceOrFail();
    return $query->where('area_id', $station->area_id);
}

Подход 2, на мой взгляд, лучше.

...