Итак, вы пытаетесь создать отношение с ManyToMany
между двумя таблицами, которым в БД нужна третья таблица, чтобы позволить вам создать такие отношения.
Это связано с тем, что у одного Wallpaper
может быть много Tag
и наоборот!Для этого вам понадобится третья таблица, в которой хранится эта информация.
Третья таблица содержит идентификаторы только по отношению к вашим двум основным таблицам.Это обеспечивает гибкость, которую вы ищете, в то время как ваши таблицы объектов могут на самом деле содержать информацию, специфичную для них, без необходимости дублировать ее.
Если вы будете хранить идентификаторы отношений в обеих таблицах, вы будете вынужденыдублируйте ваши данные, и это просто то, что вам не нужно в базах данных!Представьте себе, что вам нужно обновить 1000 строк, потому что это в основном те же обои, но с таким количеством разных тегов.
В любом случае, ниже приведен код, который должен помочь вам:
- Вы делаетенеобходимо создать класс для представления вашей таблицы отношений (спасибо классу
WallpaperTag
! Это тот самый!); - Вы больше не трогаете этот класс, не добавляете принадлежность или любую другую функцию!
- Вы создаете отношения на основных классах
Wallpaper
и Tag
;
class Wallpaper extends Model
{
...
public function tags()
{
return $this->belongsToMany('App\Tag', 'wallpaper_tag', 'tag_id', 'wallpaper_id');
}
}
class Tag extends Model
{
...
public function wallpapers()
{
return $this->belongsToMany('App\Wallpaper', 'wallpaper_tag', 'wallpaper_id', 'tag_id');
}
}
class WallpaperTag extends Model
{
}
Laravel должен создать отношения между вашими классами и сопоставить их соответственно с правильной 3-ей таблицейсортировать поиск для вас.
Если вы следуете семантике, все, что вам нужно, это имя класса.Если идентификаторы должны измениться, вам нужно будет сообщить Laravel, какие имена столбцов идентификаторов нужно искать, поскольку вы отклоняетесь от нормального поведения.Это все еще находит это, только нуждается в некотором руководстве относительно имен!Поэтому мы начинаем добавлять дополнительные параметры в отношения belongsTo
или hasMany
и т. Д.)
Миграция сводной таблицы
Вам не нужен идентификатор для вашей сводной областитаблица, поскольку ваш первичный ключ является комбинацией двух внешних ключей из других таблиц.
$table->bigInteger('wallpaper_id')->unsigned()->nullable();
$table->foreign('wallpaper_id')->references('wallpaper_id')
->on('wallpaper')->onDelete('cascade');
$table->bigInteger('tag_id')->unsigned()->nullable();
$table->foreign('tag_id')->references('tag_id')
->on('tags')->onDelete('cascade');
Дайте мне знать, если это помогло!: 3