Laravel, определяющий отношения `` многие ко многим '' с одной и той же таблицей

Итак, у меня есть таблица posts с соответствующей моделью Post. Я хочу, чтобы для каждого поста были похожие посты. Поскольку у сообщения может быть много других связанных сообщений, между таблицей posts и таблицей posts (та же таблица) существует связь «многие ко многим».

Итак, я создал сводную таблицу related_posts с соответствующей моделью RelatedPost. Я хочу определить эти отношения в двух моделях. Вот так:

Модель Почта:

public function related()
{
 return $this->belongsToMany(RelatedPost::class, 'related_posts', 'related_id', 'post_id');
}

Модель Похожие сообщения:

public function posts()
{
  return $this->belongsToMany(Post::class, 'related_posts', 'post_id', 'related_id');
}

Теперь в моем пост-контроллере после выбора определенного поста я хочу получить все связанные с ним посты. Итак, я делаю это:

$post->related()->get();

Но когда я это сделаю, я получаю следующее сообщение об ошибке:

"SQLSTATE[42000]: Syntax error or access violation: 1066 Not unique table/alias: 'related_posts' (SQL: select related_posts.*, related_posts.related_id as pivot_related_id, related_posts.post_id as pivot_post_id from related_posts inner join related_posts on related_posts.id = related_posts.post_id where related_posts.related_id = 1) "

Это моя миграция для сводной таблицы:

  Schema::create('related_posts', function (Blueprint $table) {
      $table->increments('id');
      $table->unsignedInteger('post_id');
      $table->unsignedInteger('related_id');
      $table->timestamps();

      $table->foreign('post_id')->references('id')->on('posts')->onDelete('cascade');
      $table->foreign('related_id')->references('id')->('posts')->onDelete('cascade');
  });

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

Любая помощь будет очень признательна!

Зачем вы создаете модель RelatedPost? Для промежуточного стола он вам не нужен. Ваше отношение related() не имеет смысла - оно должно указывать на модель Post через таблицу related_posts.

d3jn 27.07.2018 08:27

@ d3jn Спасибо большое, дружище. Теперь работает. Вы сэкономили мне часы!

Awa Melvine 27.07.2018 08:34

@AwaMelvine, можешь добавить сюда свой ответ?

Jinal Somaiya 27.07.2018 08:35
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout
Laravel Scout - это популярный пакет, который предоставляет простой и удобный способ добавить полнотекстовый поиск в ваше приложение Laravel. Он...
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
6
3
2 561
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Благодаря комментарию @ d3jn по моему вопросу я смог решить свою проблему. Поэтому я публикую решение здесь на случай, если оно кому-то понадобится.

Я отношу модель Post к самой себе, а не к опорной модели RelatedPost. Так что мне не нужна модель RelatedPost. Мне нужна только сводная таблица (related_post) и id отношения, а именно related_id и post_id.

Итак, моя миграция не изменилась, мне нужно только покончить с моделью RelatedPost и изменить мой метод related() в модели Post, чтобы он выглядел следующим образом:

public function related()
{
  return $this->belongsToMany(Post::class, 'related_posts', 'post_id', 'related_id');
}

И теперь все работает.

Другие вопросы по теме