Laravel Nova多对多资源失败

时间:2018-11-18 22:18:57

标签: laravel many-to-many laravel-nova

我有两种资源,砖头和墙。

Brick模型定义为

class Brick extends Model
{
    public function walls()
    {
        return $this->belongsToMany('App\Wall')->withTimestamps();
    }
}

并且Wall模型定义为

class Wall extends Model
{
    public function bricks()
    {
        return $this->hasMany('App\Brick');
    }
}

这样的想法是,一堵墙可以有许多砖头,而一堵砖头可以属于许多墙。

在Nova中,我将Wall字段设置为

public function fields(Request $request)
{
    return [
        ID::make()->sortable(),
        Text::make('Name'),
        HasMany::make('Bricks')
    ];
}

Brick字段设置为

public function fields(Request $request)
    {
        return [
            ID::make()->sortable(),
            Text::make('Name'),
            BelongsToMany::make('Walls')
        ];
    }

当尝试通过砖资源将砖连接到墙时,出现错误SQLSTATE[HY000]: General error: 1 no such table: main.wall_id (SQL: insert into "brick_wall" ("brick_id", "wall_id", "created_at", "updated_at") values (5, 1, 2018-11-18 22:08:23, 2018-11-18 22:08:23)),而当尝试通过墙资源将砖添加到墙时,我得到SQLSTATE[HY000]: General error: 1 no such column: bricks.wall_id (SQL: select * from "bricks" where "bricks"."wall_id" = 1 and "bricks"."wall_id" is not null)

我尝试切换belongsToManyhasMany关系,但这无济于事。


编辑:这是中间表的方案

Schema::create('brick_wall', function (Blueprint $table) {
            $table->increments('id');

            $table->integer('brick_id')->unsigned();
            $table->integer('wall_id')->unsigned();

            $table->foreign('brick_id')->references('id')->on('brick_id');
            $table->foreign('wall_id')->references('id')->on('wall_id');
        });

1 个答案:

答案 0 :(得分:0)

对于多对多关系,您必须具有中间表,例如mysql数据库中的brick_wall,才能在brick表和wall表之间建立多对多关系。它包含列brick_idwall_id,并且与brick表和wall表具有外键关系。

要定义多对多关系,两个模型都使用Eloquent的belongsToMany函数。它将在brickwall表之间找到关系,其中{tableName}_id作为默认列名作为主键,并且是外键。

如果您使用非标准的雄辩名称作为主键和外键,则可以参考雄辩的laravel官方文档https://laravel.com/docs/5.7/eloquent-relationships#many-to-many