【问题标题】:Laravel many-to-many with 3 modelsLaravel 多对多与 3 个模型
【发布时间】: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);
    }

}

【问题讨论】:

    标签: php laravel eloquent model many-to-many


    【解决方案1】:

    如果您得到一个包含两个以上外键的数据透视表,或者有多个多对多关系,请尝试将其视为完整模型。 这也有助于您定义更简单的关系。

    而不是多对多关系。您可以将其划分为多个一对多关系。

    例如:在您的情况下,您将拥有 4 个模型:电影、名人、角色、节目。

    • 电影有很多节目。
    • 名人有很多节目。
    • 角色 hasMany 程序。

    • 节目属于电影。
    • 节目属于名人。
    • 程序属于角色。

    有关更多详细信息,请查看有关一对多关系的 Laravel 文档:

    https://laravel.com/docs/8.x/eloquent-relationships#one-to-many

    【讨论】:

    • 其实,我想把它叫做 MovieCelebrityRole 类而不是 Program,但是你的回答是正确的。谢谢
    • 是的,这绝对是一个更好的名字,我只想举个例子......乐于助人
    猜你喜欢
    • 2018-12-12
    • 2021-05-25
    • 2017-08-26
    • 1970-01-01
    • 1970-01-01
    • 2020-10-11
    • 2014-10-29
    • 2015-10-11
    相关资源
    最近更新 更多