Как использовать полиморфное отношение многие ко многим в 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');
}