Piotrek Kaźmierczak

Piotrek Kaźmierczak sky is the limit...

Temat: [1.4] Set relacji many-to-many

najpierw kod:
 
$posilki= $kuchnia->getPosilki(); // pobiera na bank dobrze
$produkty= $ciekawy_posilek->getProdukty(); // j/w - sprawdzane

foreach($posilki as $posilek){
$posilek->setProdukty($produkty);
$posilek->save(); // po savie kolejne $posilki posiadaja dalej takie same produkty jak przed savem
}


Problem powyżej zmieniony na potrzeby tematu, jednak sytuacja niemal identyczna. Mamy dwa modele Posilek i Produkt. Każdy Posilek składa się z wielu Produktow i każdy produkt może być zawarty w różnych posiłkach.
Relacja na pewno działa. W bazie wszystko ok się tworzy, etc.

Stworzyłem formularz do edycji Posilku (można zmienić produkty, z których się składa) - wszystko działa w porządku. Po wysłaniu formularza, wszystko się zapisuje i mamy zmienione produkty w danym posiłku.

Problem powstaje gdy dodamy powyższa funkcjonalność mającą ustawić takie same produkty jakie są w $ciekawy_posilek we wszystkich posiłkach określonej kolekcji.

Pętla foreach przejeżdża po kolekcji poprawnie, jednak nic się nie zmienia w relacji kolejnych posiłków. Wie ktoś może co jest nie tak?Piotrek Kaźmierczak edytował(a) ten post dnia 29.03.11 o godzinie 14:06
Piotrek Kaźmierczak

Piotrek Kaźmierczak sky is the limit...

Temat: [1.4] Set relacji many-to-many

jeszcze dodam, że setProdukty zwraca obiekt poprawny - taki, którego bym oczekiwał
Grzegorz Śliwiński

Grzegorz Śliwiński Programista python

Temat: [1.4] Set relacji many-to-many

Spróbuj może metod link i unlink:

http://www.doctrine-project.org/projects/orm/1.2/docs/...
Piotrek Kaźmierczak

Piotrek Kaźmierczak sky is the limit...

Temat: [1.4] Set relacji many-to-many

Ok, dzięki za naprowadzenie, poszło w ten sposób:


foreach($posilki as $posilek){
if($posilek == $ciekawy_posilek) continue; // mała zmiana w pętli
$posilek->setProdukty($produkty);
$posilek->save(); // po savie kolejne $posilki posiadaja dalej takie same produkty jak przed savem
}



// klasa Posilek
public function setProdukty($produkty){
$this->ProduktPosilek->delete();

foreach($produkty as $produkt)
{
$produkt_posilek = new ProduktPosilek();
$produkt_posilek->produkt_id = ($produkt->getId());
$produkt_posilek->posilek_id = ($this->getId());
$produkt_posilek->save();
}
return $this;
}


Działa, ale nie wydaje mi się to elegancki/jedyny/taki jak sobie twórcy doctrine/symfony przewidzieli sposób.

Jeśli ktoś ma jakieś ciekawe wskazówki to będę dźwięczny.

pzdr

//edit
ale uwaga, jeśli damy:

$posilek->setProdukty($posilek->getProdukty());


to się sypiePiotrek Kaźmierczak edytował(a) ten post dnia 30.03.11 o godzinie 23:44
Grzegorz Śliwiński

Grzegorz Śliwiński Programista python

Temat: [1.4] Set relacji many-to-many

Mi chodziło raczej o użycie metod unlink i link tylko, tak, jak tutaj:

https://github.com/fizyk/fzTagPlugin/blob/1.1.x/lib/doc...

Wymaga to trochę więcej zachodu niż zwyczajne get i set.

Wystarczy u ciebie zdaje się coś podobnego:


foreach($posilki as $posilek){
if($posilek == $ciekawy_posilek) continue;
$posilek->unlink('Produkty');
$posilek->link('Produkty', $ciekawy_posilek->getProdykty()->getPrimaryKeys() );
//Save jest w tym wypadku niepotrzebny, o ile się nie mylę.
}


Oczywiście, link i unlink mogą bez problemu trafić do metody setProdukty()



Wyślij zaproszenie do