Задать вопрос
@photosho

Как реализовать такую связь в Laravel?

Есть таблица материалов (например, фильмы), которые могут быть связаны друг с другом. Для описания этой связи создаю таблицу "Links", где 2 столбца: "id_a" - id материала и "id_b" - id связанного материала.

Допустим, структура такая:

1 - 2
1 - 3
2 - 3
2 - 4


И мне нужно выбрать из таблицы "films" все связанные материалы. Например, для материала с id = 2. Мы видим, что выбирать можно как по первому столбцу, так и по второму.

Вопрос в том, насколько правильна такая структура и, возможно, это нужно реализовывать как-то по-другому? Как подобная связь реализуема в Laravel?
  • Вопрос задан
  • 1403 просмотра
Подписаться 3 Оценить 4 комментария
Решения вопроса 1
@photosho Автор вопроса
Пока сделал следующим образом. В модель "Film" добавил метод "getLinks":

public function getLinks() {
		$query = \DB::table('LINKS')->select('id_b')->where('id_a', '=', $this->id);
		$query = \DB::table('LINKS')->select('id_a')->where('id_b', '=', $this->id)
			->union($query);
		$ids = $query->get();
		$buf = [];
		foreach ($ids as $id) {
			array_push($buf, $id->id_a);
		}
		$links = Film::whereIn('id', $buf)->get();
		$this->links = $links;
		return $this;
	}


Так произвожу выбор из базы данных:

$object = Film::find($id)->getLinks();

В общем, все работает правильно, но идеи по упрощению кода (а главное, - по оптимизации) все еще принимаются.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
MasterRO
@MasterRO
Middle Laravel Developer
Читайте доку, в ларавел поддерживаются все типы связи. В данном случае https://laravel.com/docs/5.4/eloquent-relationship...
И да, можно делать связь модели на саму себя
Ответ написан
Комментировать
dlnsk
@dlnsk
ПК Партнер 01.01 -> ПК Поиск -> IBM PC
Обычная связь многие-ко-многим, просто и первая и вторая таблица - это одна и та же таблица Фильмы.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы