2015-05-28 14 views
6

Jak zdefiniować wiele do wielu polimorficznych relacji z dodatkowymi polami?Laravel - Wiele do wielu polimorficznych relacji z dodatkowymi polami

Mam trzy (lub więcej, ponieważ jest to stosunek polimorficzny) tabele.

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 zaznaczonych referes tabelę do tabeli użytkowników w kolumnie id. W moim modelu post mam:

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

iw moim modelu tagów mam:

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

Wtedy gdy jestem spróbować tego w moim kontrolera:

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

uzyskać Integrity Naruszenie ograniczeń w związku z brakiem identyfikatora użytkownika:

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.

Również próbowałem withPivot() na metkach stosunku następująco, bezskutecznie:

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

Czy próbowałeś? –

+0

Próbowałem zPivot()? Problem polega na tym, jak przypisać atrybut. Próbowałem zPivot ("identyfikator_użytkownika") i nadal otrzymuję błąd ograniczenia integralności, gdy przekazuję tablicę, która zawiera również identyfikator użytkownika do metody create. Nie umieszcza identyfikatora użytkownika w zapytaniu. – CrackingTheCode

+0

'Tworzenie' nie ma prawie nic wspólnego z' withPivot'. Więc zamiast zamieszczonego pytania (czytaj http://xyproblem.info/) pokaż, co próbujesz zrobić, czego oczekujesz i co otrzymujesz zamiast tego. –

Odpowiedz

5

Podobnie jak w komentarzu: withPivot nie ma nic wspólnego z saving/creating. Jeśli chcesz przekazać dodatkowe dane przestawne po saving, wykonaj następujące czynności:

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