首页 文章

Laravel Nova领域BelongsToMany深入挖掘数据

提问于
浏览
1

我正在使用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管理面板进入Station详细信息页面并选择“Attach manager”时,在下一页的下拉列表中(将管理器附加到部门的页面),我可以看到数据库中所有可用的管理器 . 但是,我不是在下拉列表中显示所有可用的管理器,而是希望过滤属于与所选站点相同区域的管理器/用户 . 我的意思是当我将经理连接到车站时,我必须选择一个车站 . 是否有可能过滤或实现我想要的Nova?如何?

1 回答

  • 2

    Manager nova资源下覆盖 relatableQuery 函数,该函数将确定哪些模型实例可以附加到其他资源 .

    Approach 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);
    }
    

    Update

    Approach 2 - 刚刚学到了一些新东西 .

    您可以在 Station Nova资源下为关系添加可关联的查询 . 在这种情况下,无需检查资源 .

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

    在我看来,方法2更好 .

相关问题