Zdravím,

mám problém s Doctrine: mám entity: abstract class A, class B extends Class A, class C extends Class B, class D extends class A. V anotaci ke třídě A mám:

/**
 * @ORM\Entity
 * @ORM\InheritanceType("JOINED")
 * @ORM\DiscriminatorColumn(name="discr", type="string")
 * @ORM\DiscriminatorMap({
 * "a" = "A",
 * "b" = "B",
 * "d" = "D",
 * })
 */

a ve třídě B mám:

/**
 * @ORM\Entity
 * @ORM\InheritanceType("JOINED")
 * @ORM\DiscriminatorColumn(name="discr", type="string")
 * @ORM\DiscriminatorMap({
 * "b" = "B",
 * "c" = "C"
 * })
 */

A problém je v tom, že když si uložím do databáze objekt třídy C, tak do sloupce discr v tabulce třídy A se mi narve “c”. Ale proč? A jak mám správně vyřešit takovouto zřetězenou dědičnost?

Těším se na odpovědi, Matěj Račinský

P.S.: Existuje nějaký anglický pojem pro takovouto zřetězenou dědičnost? Multiple inheritance jaksi není ono a na jiné pojmy jsem nenarazil.

Jenže na nette fóru mi moc neporadili. Vlastně vůbec. Každopádně moc díky za ten SO. Multiple level inheritance, to je to, co jsem potřeboval.

Já bych ti rád poradil, ale nepochopil jsem otázku :)

A nesnažíš se namodelovat něco co bys měl modelovat úplně nějak jinak? Tedy že máš možná blbě datovej model?

Asi jsem se vyjádřil trochu neobratně: Mám třídy User, Client, Lector.

abstract User extends KdybyBaseEntity {

// nějaké proměnné

}


Client extends User{

// nějaké další proměnné

}


Lector extends Client{

// ještě další nějaké proměnné

}

Lector dědí od Clienta, protože lektor má být zároveň klientem a nejsnazší mi přišlo, když lektor bude z klienta dědit, protože se tam zachová to, že se má chovat jako klient + umět a vědět něco navíc. No a s tím mapováním Doctrine 2 si moc nevím rady.

Udělej to raději pomocí kompozice. Místo toho aby ty třídy od sebe dědily, tak je vlož jednu do druhé.

Zkusím, ale moc se mi to nezdá. Není tohle typický příklad na dědičnost? Navíc u kompozice moc nepůjde použít polymorfismus…

Myslím že není.

Tak ty články na SO o multiple level inheritance pomohly a vše funguje hladce.


You must first log in to participate in this discussion