Итак, у меня есть таблица 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_idaspivot_related_id,related_posts.post_idaspivot_post_idfromrelated_postsinner joinrelated_postsonrelated_posts.id=related_posts.post_idwhererelated_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');
});
Я искал повсюду, и хотя решения, которые я нашел, действительно имеют смысл, я не смог заставить ни одно из них работать.
Любая помощь будет очень признательна!
@ d3jn Спасибо большое, дружище. Теперь работает. Вы сэкономили мне часы!
@AwaMelvine, можешь добавить сюда свой ответ?






Благодаря комментарию @ 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');
}
И теперь все работает.
Зачем вы создаете модель
RelatedPost? Для промежуточного стола он вам не нужен. Ваше отношениеrelated()не имеет смысла - оно должно указывать на модельPostчерез таблицуrelated_posts.