OctoberCMS:三向复杂关系

时间:2018-08-25 17:32:54

标签: laravel eloquent pivot-table octobercms octobercms-plugins

我正在尝试与数据透视表建立三向关系。

我有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               |

目前,我不知道该怎么做。 实现这种关系的最佳解决方案是什么?

1 个答案:

答案 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;
}