2015-05-28 2 views
6

Как определить много-много полиморфных отношений с дополнительными полями?Laravel - Много для многих полиморфных отношений с дополнительными полями

У меня есть три (или более, так как это полиморфное отношение) таблиц.

tags table: id, name

tagged table: id, tag_id, taggable_id, taggable_type, user_id

posts table: id, record, timestamps

users table: id, name, email

user_id на меченых таблицы referes в таблице пользователей на колонке с идентификатором. В моей Post модели у меня есть:

public function tags() 
{ 
    return $this->morphToMany('App\Tag', 'taggable','tagged'); 
} 

и в моей модели Tag у меня есть:

public function posts() 
{ 
    return $this->morphedByMany('App\Post', 'taggable','tagged'); 
} 

Тогда, когда я попробовать это в мой контроллер:

$tag = new \App\Tag(
array(
    'tag'=>"someTag" 
)); 
$tag->save() 
$post = \App\Post::find($id); 
$post->tags()->save($tag); 

я Целостность Ограничение Нарушение при отсутствии пользователя_ид:

SQLSTATE[23000]: Integrity constraint violation: 1452 Cannot add or update a child row: a foreign key constraint fails (hb . tagged , CONSTRAINT tagged_user_id_foreign FOREIGN KEY (user_id) REFERENCES users (id)) (SQL: insert into tagged (tag_id , taggable_id , taggable_type) values (26, 2, App\Resource)). Which is somewhat expected, as I have never had the chance to define or declare the user_id field.

Кроме того, я попытался withPivot() по отношению теги следующим образом, но безрезультатно:

public function tags() 
{ 
    return $this->morphToMany('App\Tag', 'taggable','tagged')->withPivot('user_id'); 
} 
+0

Вы пробовали? –

+0

Пробовал с помощью Pivot()? Проблема в том, как я могу назначить атрибут. Я попытался withPivot ('user_id'), и я все еще получаю ошибку ограничения целостности, когда передаю массив, который также содержит user_id для метода create. Он не помещает user_id в свой запрос. – CrackingTheCode

+0

'create' почти не имеет отношения к' withPivot'. Поэтому вместо вопроса, который вы опубликовали (прочтите это http://xyproblem.info/), покажите, что вы пытаетесь сделать, что вы ожидаете и что получите вместо этого. –

ответ

5

Как и в комментарии: withPivot не имеет ничего общего с saving/creating. Если вы хотите передать дополнительные опорные данные, когда saving, сделайте следующее:

$post->tags()->save($tag, ['user_id' => $userId]);