Laravel 3 个模型的多对多
Laravel many-to-many with 3 models
我有 3 个模型:电影、名人、角色。每部电影都有很多名人,每个名人在很多电影中都有很多角色(例如电影 “黄飞鸿” 有名人 “昆汀·塔伦蒂诺”作为角色[“导演”,“编剧”],显然“昆汀·塔伦蒂诺”可以有其他电影扮演不同的角色。
在这 3 个模型之间实现多对多关系的最佳方法是什么,我们可以在其中轻松地直接访问每部电影的工作人员(例如 $movie->$roles->director
)
我们是否应该用 movie_id, celebrity_id, role_id
和主键 (movie_id
, celebrity_id
, role_id
) 定义一个枢轴 table?
class Movie extends Model{
public function movieCelebrityRole()
{
return $this->hasMany(MovieCelebrityRole::class);
}
}
class Celebrity extends Model{
public function movieCelebrityRole()
{
return $this->hasMany(MovieCelebrityRole::class);
}
}
class Role extends Model{
public function userRoleCompany()
{
return $this->hasMany(MovieCelebrityRole::class);
}
}
class MovieCelebrityRole extends Model{
public function movie()
{
return $this->belongsTo(Movie::class);
}
public function celebrity()
{
return $this->belongsTo(Celebrity::class);
}
public function role()
{
return $this->belongsTo(Role::class);
}
}
如果您得到一个具有两个以上外键的主元table,或者具有多个多对多关系,请尝试将其视为完整模型。
这也有助于您定义更简单的关系。
而不是多对多关系。您可以将其分为多个一对多关系。
例如:在您的例子中,您将拥有 4 个模型:电影、名人、角色、节目。
- 电影有很多节目。
- 名人有很多节目。
- 角色有很多程序。
- 节目属于电影。
- 节目属于名人。
- 程序属于角色。
有关更多详细信息,请查看有关一对多关系的 Laravel 文档:
https://laravel.com/docs/8.x/eloquent-relationships#one-to-many
我有 3 个模型:电影、名人、角色。每部电影都有很多名人,每个名人在很多电影中都有很多角色(例如电影 “黄飞鸿” 有名人 “昆汀·塔伦蒂诺”作为角色[“导演”,“编剧”],显然“昆汀·塔伦蒂诺”可以有其他电影扮演不同的角色。
在这 3 个模型之间实现多对多关系的最佳方法是什么,我们可以在其中轻松地直接访问每部电影的工作人员(例如 $movie->$roles->director
)
我们是否应该用 movie_id, celebrity_id, role_id
和主键 (movie_id
, celebrity_id
, role_id
) 定义一个枢轴 table?
class Movie extends Model{
public function movieCelebrityRole()
{
return $this->hasMany(MovieCelebrityRole::class);
}
}
class Celebrity extends Model{
public function movieCelebrityRole()
{
return $this->hasMany(MovieCelebrityRole::class);
}
}
class Role extends Model{
public function userRoleCompany()
{
return $this->hasMany(MovieCelebrityRole::class);
}
}
class MovieCelebrityRole extends Model{
public function movie()
{
return $this->belongsTo(Movie::class);
}
public function celebrity()
{
return $this->belongsTo(Celebrity::class);
}
public function role()
{
return $this->belongsTo(Role::class);
}
}
如果您得到一个具有两个以上外键的主元table,或者具有多个多对多关系,请尝试将其视为完整模型。 这也有助于您定义更简单的关系。
而不是多对多关系。您可以将其分为多个一对多关系。
例如:在您的例子中,您将拥有 4 个模型:电影、名人、角色、节目。
- 电影有很多节目。
- 名人有很多节目。
- 角色有很多程序。
- 节目属于电影。
- 节目属于名人。
- 程序属于角色。
有关更多详细信息,请查看有关一对多关系的 Laravel 文档:
https://laravel.com/docs/8.x/eloquent-relationships#one-to-many