laravel nova BelongsToMany-属于枢轴

时间:2018-12-11 11:55:25

标签: laravel-nova

在Laravel Nova中,我有BelongsToMany关系(公司-枢纽-请求)。

在“数据透视表”中,我还有一些其他列,这些列可以通过数据透视字段(https://nova.laravel.com/docs/1.0/resources/relationships.html#belongstomany)访问,效果很好。

但是现在我有一个特殊的情况,我在数据透视表到第三个表(状态)之间还有一个额外的BelongsTo关系。我试图在枢轴字段中定义一个BelongsTo字段,但这不起作用。

BelongsToMany::make('Companies', 'companies', Company::class)->fields(new CompanyRequestFields()),

数据透视字段:

class CompanyRequestFields
{
    /**
     * Get the pivot fields for the relationship.
     *
     * @return array
     */
    public function __invoke()
    {
        return [
            Number::make('preis'),
            Text::make('bezahlt'),
             BelongsTo::make('State', 'state', States::class),
        ];
    }
}

我得到的错误:

Call to undefined method Illuminate\Database\Eloquent\Relations\Pivot::state()

关系state()实际上存在于数据透视模型上,并且也有一个Nova资源状态类。

因此看来PivotFields不支持此功能?还是有人知道是否有可能实现这一目标?

2 个答案:

答案 0 :(得分:0)

我无法使其与数据透视表中的关系一起使用,但是无需使用如下所示的关系定义就可以实现它。

class CompanyRequestFields
{
    public function __invoke()
    {
        $states= \App\State::all()->pluck('name', 'id');

        return [
            ...
            Select::make('State')->options($states),
        ];
    }
}

\App\Request模型中

public function companies()
{
    return $this->belongsToMany('App\Company')->withPivot('state');
}

希望这种方法对您有帮助。

答案 1 :(得分:-1)

  

这是针对普通Laravel 的,如果可以,只需将sintaxis更改为laravel nova!

在Normal Laravel中,如果您想定义一个自定义模型来表示关系的中间表,则可以在定义关系时调用using方法。自定义多对多数据透视模型应该扩展Illuminate \ Database \ Eloquent \ Relations \ Pivot类,而自定义多态多对数据透视模型应该扩展Illuminate \ Database \ Eloquent \ Relations \ MorphPivot类。您可以定义一个自定义的Companies_requests枢纽模型:

<?php

namespace App;

use Illuminate\Database\Eloquent\Relations\Pivot;

class Companies_requests extends Pivot
{
    //
}

并在您的公司模型和请求模型中引用它:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Company extends Model
{
    public function requests()
    {
        return $this->belongsToMany('App\Request')->using('App\Companies_requests');
    }
}

。     

namespace App;

use Illuminate\Database\Eloquent\Model;

class Request extends Model
{
    public function companies()
    {
        return $this->belongsToMany('App\Company')->using('App\Companies_requests');
    }
}

现在,->pivot将成为您的新型号!

希望这就是您要搜索的内容:)