IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Diskuze: Symfony doctrine vazba OneToMany

Aktivity
Avatar
Adam Matis
Člen
Avatar
Adam Matis:23.12.2019 19:28

Ahoj mám problém. Mám dvě entity Nabídka x Zakázka s vazbami OneToMany x ManyToOne.
A potřebuji aby když se ve formuláři nabídka nastavila zakázka aby se automaticky nastavila nabídka také v zakázce. Zároveň to musí fungovat i obráceně v případě že se vytváří prvni zakázka.

Z nabídky to funguje ok zakázka se ukládá i maže. Ze zakázky to ale nejde ani nabídku odstranit ani přidat novou. (změny se neuloží)

Zkusil jsem:

class Zakazka
{
    /**
     * @var ArrayCollection|null
     * @ORM\OneToMany(targetEntity="Nabidka",mappedBy="zakazka")
     * @ORM\JoinColumns({
     * @ORM\JoinColumn(name="nabidka_id", referencedColumnName="id", nullable=true)
     * })
     */
    protected $nabidka;

    public function addNabidka(Nabidka $nabidka) {
        $this->nabidka->add($nabidka);
        $nabidka->setZakazka($this);
        return $this;
    }

    public function removeNabidka(Nabidka $nabidka){
        if($this->nabidka->contains($nabidka)){

            $this->nabidka->remove($nabidka);

            if($nabidka->getZakazka()=== $this) {
                $nabidka->setZakazka(null);
            }
        }
    }
}
class Nabidka
{
    /**
     * @var Zakazka
     *
     * @ORM\ManyToOne(targetEntity="Zakazka",inversedBy="nabidka")
     * @ORM\JoinColumns({
     *   @ORM\JoinColumn(name="zakazka_id", referencedColumnName="id")
     * })
     */
    private $zakazka;
}

Chci docílit: Potřebuji aby když jsem ve formuláři uložil/odstranil nabídku aby se v zákázce automaticky nastavila/smazala tato nabídka. Zároveň potřebuju aby to fungovalo i obraceně tedy ze zakázky.

Editováno 23.12.2019 19:30
 
Odpovědět
23.12.2019 19:28
Avatar
pechynho
Člen
Avatar
pechynho:25.12.2019 21:09

Nejsem u PC, takže ti nedám úplně přesnou odpověď. Anotace OneToMany a ManyToOne mají atribut cascade, což je pole kam se zadává persist, refresh, delete a all. To určuje jak se zachází s přidruženými entitami, když se ukládá nějaká entita. Více zde https://www.doctrine-project.org/…iations.html.

 
Nahoru Odpovědět
25.12.2019 21:09
Avatar
Richard
Inzerent nabídek práce
Avatar
Richard:27.12.2019 16:36

O relaci v Doctrine je vzdy jedna strana vazby tzv. řídící a jedna strana vazby ne. tzn. owning side a inverse side. Pak platí že když u hlavní části relace přidáš i tu vazbu a uložíš pomocí persist + flush tu hlavní tak se uloží i ta druhá strana.

Ale pokud založíš tu slabší stranu, neřídící a tu ukládáš tak se ta vazba neuloží.
Tedy vždy je potřeba si hlídat ty dvě strany.

viz
https://www.doctrine-project.org/…iations.html

My v týmu programujeme na ukládání složité entity s vazbami speciální service, třeba v tomto případě něco jako ProposalCreator a ten ma metodu např. createAndSave­Proposal do které pošleme všechna data z formuláře (valueobject - dataholder) a v ní se vyrobí nezbytné entity a ty se uloží - každá extra persistem a pak na závěr jeden flush.

Snad jsme to popsal srozumitelne, kdyz tak napis.

Btw. Doporučuji vše v kódu psát anglicky. Včetně názvů proměnných , tříd, interfaces etc....

Akceptované řešení
+20 Zkušeností
+2,50 Kč
Řešení problému
Nahoru Odpovědět
27.12.2019 16:36
Udělej to teď - možná nebudeš mít už čas to udělat později
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 3 zpráv z 3.