OctoberCMS: трехсторонние сложные отношения

Я пытаюсь создать трехстороннюю связь со сводной таблицей.

Что у меня 4 модели; Фильм, Люди, PeopleRole и MovieCast.

В настоящее время у меня есть такая схема БД:

фильмы_

-------------------
| id | name       |
|----|------------|
| 1  | Fight Club |
| 2  | Inception  |

movies_people

-------------------
| id | name       |
|----|------------|
| 1  | Brad Pitt  |
| 2  | Tom Cruise |

movies_peoples_roles

--------------------
| id | name       |
|----|------------|
| 1  | Director   |
| 2  | Writers    |

movies_casts (сводная таблица)

--------------------------------------------------
| (pk) movie_id | (pk) role_id |  (pk) people_id |
|---------------|--------------|-----------------|
| 1             | 1            | 1               |
| 1             | 1            | 2               |
| 1             | 2            | 1               |
| 2             | 1            | 2               |

В настоящее время я понятия не имею, как это сделать. Какое лучшее решение для реализации такого отношения?


person onurguven    schedule 25.08.2018    source источник


Ответы (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;
}
person Erubiel    schedule 25.08.2018