Как использовать полиморфное отношение многие ко многим в Laravel 5.2
я читаю Laravel 5.2 docs для реализации многих и многих полиморфных отношений в моем приложении Laravel.
У меня много моделей, таких как Blog
, Question
, Photo
etc и я хочу иметь систему тегов для всех из них.
Я создал таблицу тегов со следующей схемой
Schema::create('tags', function (Blueprint $table) {
$table->increments('id');
$table->string('name');
$table->string('slug')->unique();
$table->timestamps();
});
ниже приведена схема сводной таблицы. Сводная таблица entity_tags
Schema::create('entity_tags', function (Blueprint $table) {
$table->increments('id');
$table->integer('tag_id')->unsigned();;
$table->integer('taggable_id')->unsigned();
$table->string('taggable_type');
$table->timestamps();
$table->index('tag_id');
$table->index('taggable_id');
$table->index('taggable_type');
});
это отношение определено в Tag
модель Question
модель
public function questions()
{
return $this->belongsToMany('AppQuestion', 'entity_tags', 'tag_id', 'taggable_id');
}
и следующее отношение определяется в Question
модель
public function tags()
{
return $this->belongsToMany('AppTag', 'entity_tags', 'taggable_id', 'tag_id');
}
теперь я хочу определить многие ко многим полиморфные отношения, как определено в Laravel 5.2.
Мой вопрос
- как я могу их определить?
- должен ли я удалить много для многих отношения и только определяют многие ко многим полиморфные отношения ? Если да, то как управлять пользовательским именем сводной таблицы ?
- также требуется суффикс имени столбца со словом
able
что быть частью полиморфная связь ?
1 ответов
используйте return $this->morphToMany() вместо belongsToMany, а в модели тегов напишите 3 метода с return $this - >morphedByMany() для обратной связи.
вам нужны только полиморфные определения, нет необходимости во многих для многих нормальных. Имя сводной таблицы с "возможностью" в конце по умолчанию, но вы можете назвать его как угодно.
нет, вы не должны иметь слово с 'в состоянии' в конце концов, это просто способ определить, что это нечто более общее, вы можете назвать это как угодно.
именование основано на некотором соглашении по умолчанию Laravel.
обновление:
у вас есть следующая схема сводной таблицы:
Schema::create('entity_tags', function (Blueprint $table) {
$table->increments('id');
$table->integer('tag_id')->unsigned();;
$table->integer('entity_id')->unsigned();
$table->string('entity_type');
$table->timestamps();
$table->index('tag_id');
$table->index('entity_id');
$table->index('entity_type');
});
и таблица тегов:
Schema::create('tags', function (Blueprint $table) {
$table->increments('id');
$table->string('name');
$table->string('slug')->unique();
$table->timestamps();
});
Итак, вы хотите создать отношения для таблиц / моделей блога, видео и вопросов:
тег.РНР Модель:
public function questions()
{
return $this->morphedByMany('App\Question', 'entity', 'entity_tags');
}
public function blogs()
{
return $this->morphedByMany('App\Blog', 'entity', 'entity_tags');
}
public function videos()
{
return $this->morphedByMany('App\Video', 'entity', 'entity_tags');
}
вопрос.php / блог.php / видео.в PHP
public function tags()
{
return $this->morphToMany('App\Tag', 'entity', 'entity_tags');
}