2013-03-25 12 views
7

Niedawno rozpocząłem współpracę z Laravel4. Mam do czynienia z pewnym problemem podczas aktualizowania danych tabeli przestawnej, w przypadku wielu do wielu relacji.zaktualizuj tabelę przestawną w przypadku wielu lub wielu relacji laravel4

Sytuacja jest: Mam dwie tabeli: produkt, Producttype. Relacja między nimi to Wiele dla wielu. Moje modele są

class Product extends Eloquent { 
    protected $table = 'products'; 
    protected $primaryKey = 'prd_id'; 

    public function tags() { 
     return $this->belongsToMany('Tag', 'prd_tags', 'prta_prd_id', 'prta_tag_id'); 
    } 
} 

class Tag extends Eloquent { 
    protected $table = 'tags'; 
    protected $primaryKey = 'tag_id'; 
     public function products() 
    { 
    return $this->belongsToMany('Product', 'prd_tags', 'prta_prd_id', 'prta_tag_id'); 
    } 
} 

Podczas wstawiania danych do prd_tags stół obrotowy zrobiłem:

$product->tags()->attach($tag->tagID); 

Ale teraz chcę zaktualizować dane w tabeli przestawnej, co jest najlepszym sposobem, aby aktualizować dane do stołu przestawnego. Załóżmy, że chcę usunąć niektóre tagi i dodać nowe tagi do konkretnego produktu.

+0

Czytałaś te informacje w doktorzy? Czy to w ogóle pomaga ... http://four.laravel.com/docs/eloquent#working-with-pivot-tables –

+0

@PhillSparks: Tak, przejrzałem ten dokument. w tym celu jest metoda o nazwie sync, która zajmie tablicę identyfikatorów i wstawi i usunie odpowiednio, ale co, jeśli moja tabela przestawna ma atrybuty inne niż identyfikatory obu tabel. Metoda synchronizacji powinna przyjmować tablicę obiektów zamiast tablicy liczb całkowitych. – Sameer

+1

Eonquent promuje prosty projekt tabeli, w której tabele przestawne mają kolumny identyfikatorów używane do odwoływania się do wierszy. Oprogramowanie Eloquent nie zostało zaprojektowane z myślą o innych projektach baz danych, ponieważ dostępne są bardziej kompleksowe rozwiązania ORM. –

Odpowiedz

5

wiem, że jest to stara sprawa, ale jeśli nadal jesteś zainteresowany w roztworze, to jest tutaj:

Powiedzmy tabeli przestawnej ma „foo” i „bar” jako dodatkowych atrybutów, można to zrobić, aby wstawić dane do tej tabeli:

$product->tags()->attach($tag->tagID, array('foo' => 'some_value', 'bar'=>'some_other_value')); 
32

Stare pytanie, ale w dniu lis 13, 2013, metoda updateExistingPivot zostało upublicznione za wiele do wielu relacji. Nie ma to jeszcze oficjalnej dokumentacji.

public void updateExistingPivot(mixed $id, array $attributes, bool $touch) 

- Aktualizuje istniejący rekord przestawny na stole.

Od 21 lutego 2014 r. Należy uwzględnić wszystkie trzy argumenty.

W twoim przypadku (jeśli chcesz zaktualizować „foo” Pole PIVOT) można zrobić:

$product->tags()->updateExistingPivot($tag->tagID, array('foo' => 'value'), false); 

Albo można zmienić ostatni boolean false na true jeśli chcesz dotknąć znacznika czasu nadrzędnego .

prośba Pull:

https://github.com/laravel/framework/pull/2711/files

+2

Fantastyczne.Chciałbym zaktualizować oficjalne dokumenty, aby podkreślić tę metodę. To powinno być oznaczone jako poprawna odpowiedź. Twoje zdrowie! –

+0

Doskonały, dzięki! – Guicara

+0

'public void', literówka? – haakym

4

Inna metoda to podczas pracy z laravel 5.0+

$tag = $product->tags()->find($tag_id); 
$tag->pivot->foo = "some value"; 
$tag->pivot->save(); 
+1

Muszę wykonać '$ pivot-> pivot-> save();', aby zapisać moją tabelę przestawną. – MECU

+0

jest to w rzeczywistości najłatwiejsze dostępne rozwiązanie. – dexterb

+0

Jeśli użyjesz tej metody, otrzymasz komunikat o błędzie: 'Pośrednia modyfikacja przeciążonej właściwości nie ma żadnego efektu' – JackalopeZero

0

to pełny przykład:

$user = $this->model->find($userId); 
    $user->discounts() 
     ->wherePivot('discount_id', $discountId) 
     ->wherePivot('used_for_type', null) 
     ->updateExistingPivot($discountId, [ 
      'used_for_id' => $usedForId, 
      'used_for_type' => $usedForType, 
      'used_date_time' => Carbon::now()->toDateString(), 
     ], false); 
Powiązane problemy