我有两种资源,砖头和墙。
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)
>
我尝试切换belongsToMany
和hasMany
关系,但这无济于事。
编辑:这是中间表的方案
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');
});
答案 0 :(得分:0)
对于多对多关系,您必须具有中间表,例如mysql数据库中的brick_wall
,才能在brick
表和wall
表之间建立多对多关系。它包含列brick_id
和wall_id
,并且与brick
表和wall
表具有外键关系。
要定义多对多关系,两个模型都使用Eloquent的belongsToMany
函数。它将在brick
和wall
表之间找到关系,其中{tableName}_id
作为默认列名作为主键,并且是外键。
如果您使用非标准的雄辩名称作为主键和外键,则可以参考雄辩的laravel官方文档https://laravel.com/docs/5.7/eloquent-relationships#many-to-many