Laravel Nova字段属于ToMany向下钻取数据

时间:2018-11-08 15:30:05

标签: laravel has-and-belongs-to-many laravel-nova

我正在使用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想要的功能?

1 个答案:

答案 0 :(得分:3)

覆盖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 Nova资源下为该关系添加一个相关查询。在这种情况下,无需检查资源。

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

我认为方法2更好。