Laravel Nova覆盖/设置Fields或Has Through关系的自定义值

时间:2018-11-02 13:44:48

标签: laravel laravel-nova

我正在使用Laravel开发Web应用程序。对于管理面板,我正在使用Laravel Nova。我现在想做的是,我需要使用来自具有通过另一个表的关系的表中的数据。明确地说,请参阅下面的我的数据库结构。

items
=====
id
name
price
sub_category_id

sub_categories
==============
id
name
parent_category_id

parent_categories
=================
id
name

我想要在Nova中实现的是,我想在项目索引/列表页面上显示该项目的父类别名称。首先,我不想在模型中创建类似这样的自定义属性

protected $appends = [
        'parent_category_name'
    ];

function getParentCategoryNameAttribute()
{
    //code here
}

因此,我可以想到两种解决方案。第一种解决方案是使用HasThrough关系。但是我在Nova中找不到它。所以,我不能使用它。第二种解决方案是在渲染时覆盖字段值。像这样的东西。

Text::make("fieldname")->fillUsing(function($request, $model, $attribute, $requestAttribute) {
                //$model->sub_category->parent_category - then I can return a value
                return "Parent category name";
            })->onlyOnIndex()

但是上面的代码不起作用。那么,在Nova中处理直通关系的最佳方法是什么?

1 个答案:

答案 0 :(得分:1)

假设您已经正确定义了关系sub_categoryparent_category

Item模型中定义关系,如下所示

public function parent_category()
{
    return $this->sub_category->parent_category();
}

然后按如下所示在Item资源中使用它。

BelongsTo::make('Parent Category')
    ->hideWhenCreating()
    ->hideWhenUpdating(),