0

我有两个资源,砖和墙。

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');
        });
4

1 回答 1

0

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

为了定义多对多关系,两个模型都使用belongsToManyEloquent 的函数。它将查找brickwall表之间的关系{tableName}_id,默认列名作为主键和外键。

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

于 2018-11-19T02:53:10.623 回答