2

Laravelを使用してWebアプリケーションを開発しています。管理パネルの構築に 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 でフィルター処理したり、目的を達成したりすることはできますか?

4

1 に答える 1

5

モデルのどのインスタンスをnova リソースrelatableQueryの下の他のリソースにアタッチできるかを決定する関数をオーバーライドします。Manager

アプローチ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 - たった今、何か新しいことを学びました。

StationNova リソースの下のリレーションシップに関連付け可能なクエリを追加できます。この場合、リソースを確認する必要はありません。

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

私の意見では、アプローチ2の方が優れています。

于 2018-11-09T05:51:37.687 に答える