2012-05-01 5 views
6

Sto cercando una soluzione per il seguente problema con un'ereditarietà del database utilizzando Doctrine 2 integrato nel framework Symfony 2. Questo è quello che voglio fare ...Symfony 2 + ereditarietà di Doctrine 2 +

enter image description here

voglio creare due tabelle (UredniHodiny, KonzultacniHodiny) con la stessa interfaccia come la classe astratta hodiny. Questo è il modo che sto cercando di farlo

<?php 

// src/CvutPWT/ImportBundle/Entity/Hodiny.php 
namespace CvutPWT\ImportBundle\Entity; 

use Doctrine\ORM\Mapping as ORM; 

/** 
* @ORM\MappedSuperclass 
*/ 
abstract class Hodiny 
{ 

    /** 
    * @ORM\Id 
    * @ORM\Column(type="integer") 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    protected $id; 

    /** 
    * @ORM\ManyToOne(targetEntity="Osoba") 
    */ 
    protected $osoba; 

    /** 
    * @ORM\ManyToOne(targetEntity="Mistnost") 
    */ 
    protected $mistnost; 

    /** 
    * @ORM\Column(type="datetime") 
    */ 
    protected $zacatek; 

    /** 
    * @ORM\Column(type="datetime") 
    */ 
    protected $konec; 

} 


<?php 

// src/CvutPWT/ImportBundle/Entity/KonzultacniHodiny.php 
namespace CvutPWT\ImportBundle\Entity; 

use Doctrine\ORM\Mapping as ORM; 

/** 
* @ORM\Entity 
* @ORM\Table(name="konzultacnihodiny") 
*/ 
class KonzultacniHodiny extends Hodiny 
{ 

} 

<?php 

// src/CvutPWT/ImportBundle/Entity/UredniHodiny.php 
namespace CvutPWT\ImportBundle\Entity; 

use Doctrine\ORM\Mapping as ORM; 

/** 
* @ORM\Entity 
* @ORM\Table(name="urednihodiny") 
*/ 
class UredniHodiny extends Hodiny 
{ 

} 

Ora, quando corro php app/console doctrine:generate:entities CvutPWTImportBundle Symfony genera tutte le variabili (più precisamente colonne) da classe HODINY come variabili private per entrambe le classi figlio. Ora, quando sto cercando di creare quei tavoli con app/console doctrine:schema:update --force, sto ricevendo errori che $id must be protected or weaker. Quando cambio manualmente questa protezione, sono in grado di creare tabelle ma c'è solo una colonna (id). Ma questo non è quello che speravo. Qualcuno può darmi qualche consiglio su cosa sto facendo male?

+0

Ehi, questo funziona come previsto per me. Prendo un tavolo chiamato 'konzultacnihodiny' e un tavolo chiamato' urednihodiny' che contengono entrambi 5 campi. Nota Avevo anche bisogno di aggiungere altre due entità dal momento che sono attualmente FK nella classe base Hodiny. Si dovrebbe anche confermare quale [tipo di ereditarietà] (http://docs.doctrine-project.org/projects/doctrine-orm/en/2.0.x/reference/inheritance-mapping.html) si desidera utilizzare come ce ne sono più di uno. – Shane

risposta

8

Questa non è un'eredità di tabella. Le super classi mappate stanno solo mappando l'ereditarietà. Le tabelle corrispondenti alle entità finali non saranno considerate in alcun modo contigue.

Se volete vera eredità tabella (tabella singola o tabella unita), utilizzare questo: http://docs.doctrine-project.org/projects/doctrine-orm/en/2.0.x/reference/inheritance-mapping.html#single-table-inheritance

Se si desidera continuare a utilizzare le classi Super mappate, allora si dovrà mettere la definizione @ORM\Id in entrambe le classi finali. È possibile non inserire ID in super classi mappate.