Laravel 多对多与 3 个模型
Posted
技术标签:
【中文标题】Laravel 多对多与 3 个模型【英文标题】:Laravel many-to-many with 3 models 【发布时间】:2021-07-25 01:40:28 【问题描述】:我有 3 个模特:电影、名人、角色。每部电影都有很多名人,每个名人在很多电影中都有很多角色(例如电影“黄飞鸿”有名人“昆汀·塔伦蒂诺”作为角色[“导演”、“作家”],显然“昆汀·塔伦蒂诺”可以让其他电影扮演不同的角色。
在这 3 个模型之间实现多对多关系的最佳方式是什么,我们可以轻松地直接访问每部电影的工作人员(如 $movie->$roles->director
)
我们是否应该使用movie_id, celebrity_id, role_id
和主键(movie_id
、celebrity_id
、role_id
)定义一个数据透视表?
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);
【问题讨论】:
【参考方案1】:如果您得到一个包含两个以上外键的数据透视表,或者有多个多对多关系,请尝试将其视为完整模型。 这也有助于您定义更简单的关系。
而不是多对多关系。您可以将其划分为多个一对多关系。
例如:在您的情况下,您将拥有 4 个模型:电影、名人、角色、节目。
电影有很多节目。 名人有很多节目。 角色 hasMany 程序。节目属于电影。 节目属于名人。 程序属于角色。
有关更多详细信息,请查看有关一对多关系的 Laravel 文档:
https://laravel.com/docs/8.x/eloquent-relationships#one-to-many
【讨论】:
其实,我想把它叫做 MovieCelebrityRole 类而不是 Program,但是你的回答是正确的。谢谢 是的,这绝对是一个更好的名字,我只想举个例子......乐于助人以上是关于Laravel 多对多与 3 个模型的主要内容,如果未能解决你的问题,请参考以下文章