OctoberCMS: трехсторонние сложные отношения - PullRequest
0 голосов
/ 25 августа 2018

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

Какие у меня 4 модели; Movie, People, PeopleRole и MovieCast .

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

movies_

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

movies_peoples

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

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

1 Ответ

0 голосов
/ 26 августа 2018

Полагаю, вы хотите следующее,

Для фильмов вам нужен список актеров и ролей.

Для актеров вам нужен список фильмов и ролей

Для ролей вам может потребоваться список актеров и фильмов

Так что в моей модели 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;
}
...