Ahoj,

mám trochu problém s relací obousměrnou oneToOne.

Mám třídu, která je hlavní a neobsahuje cizí klíč.

class Trida1{
    /**
     * @ORM\OneToOne(targetEntity="Trida2", mappedBy="prvni", orphanRemoval=true, cascade={"persist"})
     **/
    protected $druha;
}

a druhou třídu, která rozšiřuje vlastnosti první s cizím klíčem.

class Trida2{
/**
     * @ORM\OneToOne(targetEntity="Trida1", inversedBy="druha")
     * @ORM\JoinColumn(name="trida1_id", referencedColumnName="id")
     */
    protected $prvni;
}

pokud vytvořím entitu a naplním i referenci “Trida1 druha” … pak dam persist a flush, tak mi to při založení vygeneruje správné inserty s jedním problémem a to, že Trida2 neobdrží referencující cizí klíč trida1_id. Pokud ho v DB ručně doplním a třídu načtu, tak reference se načte a další persist už je ok. Takže mi tam asi chybí nějaká anotace, která by říkala aby se pri insertu instanci Tridy2 doplnilo trida1_id resp $prvni;

Předem díky. Chap

Ahoj, tohle je “feature” Doctriny. Doctrina sama nebude měnit reference v entitách, a pokud vložíš referenci na tu “špatnou” stranu, tak ti ji pak ani neupdatne v databázi.

Jednak, dávej si pozor na to, která entita vlastní tu druhou entitu, ať máš sloupeček ve správné entitě. Ona pak ta interakce objektů je dost nelogická, když třeba autor by měl obsahovat idčko článku, to by bylo divné že. Musíš nad tím přemýšlet, jako kdyby databáze vůbec neexistovala a třídy podle toho navrhnout.

Interakce by pak měla vypadat takto nějak

class Trida1
{
     /** @ORM\OneToOne(targetEntity="Trida2", mappedBy="prvni", orphanRemoval=true, cascade={"persist"}) */
     protected $druha;

    public function __construct()
    {
        $this->druha = new Trida2($this);
    }
}

class Trida2
{
    /** @ORM\OneToOne(targetEntity="Trida1", inversedBy="druha") */
    protected $prvni;


    public function __construct(Trida1 $prvni)
    {
        $this->prvni = $prvni;
    }
}

Takovéto provázání pak už dává smysl pro typ vazby jaký jsi zvolil a mělo by fungovat.


You must first log in to participate in this discussion