laravel nova BelongsToMany - 枢轴中的 BelongsTo

ndb*_*erg 5 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()),
Run Code Online (Sandbox Code Playgroud)

枢轴字段:

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),
        ];
    }
}
Run Code Online (Sandbox Code Playgroud)

我得到的错误:

Call to undefined method Illuminate\Database\Eloquent\Relations\Pivot::state()
Run Code Online (Sandbox Code Playgroud)

关系 state() 实际上存在于枢轴模型上,并且还有一个 Nova 资源状态类。

所以看起来 PivotFields 不支持这个?或者有谁知道是否有可能实现这一目标?

Sau*_*nam 5

我无法使其与数据透视表中的关系一起使用,但您可以在没有关系定义的情况下实现它,如下所示。

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

        return [
            ...
            Select::make('State')->options($states),
        ];
    }
}
Run Code Online (Sandbox Code Playgroud)

\App\Request模型中

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

希望这个方法对你有帮助。


小智 -5

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

在普通 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
{
    //
}
Run Code Online (Sandbox Code Playgroud)

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

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

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

namespace App;

use Illuminate\Database\Eloquent\Model;

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

现在,这->pivot将是您的新模型!

希望这就是您正在寻找的:)