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_idcelebrity_idrole_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 个模型的主要内容,如果未能解决你的问题,请参考以下文章

一对一与多对多与重复条目

流利的 NHibernate 多对多与额外的列不插入

laravel查询多对多

Laravel5.1 模型 --多对多关系

Laravel 关系多对多按外键计数相关数据

Laravel 多对多关系 sync() 其中