我正在尝试与数据透视表建立三向关系。
我有4种型号; 电影,人物,PeopleRole和MovieCast 。
我目前具有这样的数据库模式:
电影_
-------------------
| id | name |
|----|------------|
| 1 | Fight Club |
| 2 | Inception |
电影人
-------------------
| id | name |
|----|------------|
| 1 | Brad Pitt |
| 2 | Tom Cruise |
movies_peoples_roles
--------------------
| id | name |
|----|------------|
| 1 | Director |
| 2 | Writers |
电影播放(数据透视表)
--------------------------------------------------
| (pk) movie_id | (pk) role_id | (pk) people_id |
|---------------|--------------|-----------------|
| 1 | 1 | 1 |
| 1 | 1 | 2 |
| 1 | 2 | 1 |
| 2 | 1 | 2 |
目前,我不知道该怎么做。 实现这种关系的最佳解决方案是什么?
答案 0 :(得分:1)
我想,你想要以下内容,
对于电影,您需要演员名单和角色列表。
对于演员,您需要电影和角色列表
对于角色,您可能需要演员和电影列表
因此,在我的模型MovieCast
中,我将为每个模型添加一个belongsTo()
关系,因为这很容易理解,因此我不会添加示例,除非您在评论。
然后,您应该添加它,因为它没有主键:
/**
* primaryKey
*
* @var integer
* @access protected
*/
protected $primaryKey = null;
/**
* Indicates if the IDs are auto-incrementing.
*
* @var bool
*/
public $incrementing = false;
然后在其他每个模型中,我都将与MovieCast模型添加关系,例如:
电影模型
public function casting(){
return hasMany('\App\MovieCast', 'movie_id', 'id');
}
演员模型
public function appears_on(){
return hasMany('\App\MovieCast', 'people_id', 'id');
}
角色模型
// Please replace my ridiculous name with something else
public function actors_and_movies_with_this_role(){
return hasMany('\App\MovieCast', 'role_id', 'id');
}
然后,当您访问演员时,您可以使用类似以下内容的东西:
foreach($actor->appears_on as $appearance){
echo $appearance->movie->name;
echo $appearance->role->name;
}