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