Laravel Nova 字段 BelongsToMany 向下钻取数据

Posted

技术标签:

【中文标题】Laravel Nova 字段 BelongsToMany 向下钻取数据【英文标题】:Laravel Nova field BelongsToMany drilling down the data 【发布时间】:2019-04-12 03:39:15 【问题描述】:

我正在使用 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 details 页面并选择“Attach manager”时,在下一页(将经理附加到部门的页面)的下拉列表中,我可以看到所有可用的经理在数据库中。

但我不想在下拉列表中显示所有可用的经理,而是过滤与所选站属于同一区域的经理/用户。我的意思是当我将一名经理附加到车站时,我必须选择一个车站。是否可以在 Nova 中过滤或实现我想要的?

【问题讨论】:

【参考方案1】:

覆盖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 更好。

【讨论】:

感谢@samuni,它正在工作。但不是方法 2。所以我使用了方法 1。干杯。 啊。我不知道为什么它对我不起作用。当我有机会时,我会再试一次。谢谢大佬。 确保将 relatable() 函数放在请求资源中。原题函数relatableManagers的例子中需要在Station资源文件中添加。这与需要在 Manager 资源中添加的 relatableQuery 功能相反。

以上是关于Laravel Nova 字段 BelongsToMany 向下钻取数据的主要内容,如果未能解决你的问题,请参考以下文章

Laravel Nova 自定义字段获取模型值

Laravel Nova 字段 BelongsToMany 向下钻取数据

Laravel Nova:按列分组表单字段

Laravel - 从 ajax 响应数据中的产品 (belongsTo) 访问子类别。

如何在 laravel nova 管理面板中定义时间字段

如何显示Laravel Nova中的加密字段值?