2016-02-28 7 views
5

Я читаю laravel 5.2 docs для реализации многих-многих полиморфных отношений в моем приложении Laravel. У меня есть много моделей, таких как Blog, Question, Photo и т. Д., И я хочу иметь систему маркировки для всех них. Я создал таблицу тегов со следующей схемойКак использовать много-много полиморфных отношений в Laravel 5.2

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('App\Question', 'entity_tags', 'tag_id', 'taggable_id'); 
} 

И следующее соотношение определяется в Question модели

public function tags() 
{ 
    return $this->belongsToMany('App\Tag', 'entity_tags', 'taggable_id', 'tag_id'); 
} 

Теперь я хочу Определите много-много полиморфных отношений, как определено в Laravel 5.2.
Мой вопрос являются

  • как я могу определить их?
  • Должен ли я удалить отношение Many to Many и определить только многие из многих полиморфных отношений? Если да, то как управлять настраиваемым именем сводной таблицы?
  • Также требуется суффикс имени столбца со словом able, которые являются составными частями полиморфных отношений?

ответ

4
  • Использование возврата $ этом-> morphToMany() вместо belongsToMany, и в модели Tag, написать 3 метода с обратным $ 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(); 
}); 

Так что вы хотите создать отношения для блог, видео и вопроса таблицы/модели:

Тег.PHP Модель:

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'); 
} 

Question.php/blog.php/Video.php

public function tags() 
{ 
    return $this->morphToMany('App\Tag', 'entity', 'entity_tags'); 
} 
+0

Я попробовал решение, но ниже ошибки, когда я спасал новый вопрос 'SQLSTATE [42S22] : Столбец не найден: 1054 Неизвестный столбец 'tagz_type' в 'where clause' (SQL: выберите 'entity_type' из 'entity_tags', где 'entity_id' = 4 и 'tagz_type' = App \ Question) ' Я думаю, что второй параметр должен быть 'xyz' –

+0

Еще одна вещь, вместо' xyz_id' и 'xyz_type', я использовал' entity_id' и 'entity_type' –

Смежные вопросы