2011-02-19 20 views
5

Ho due entità: Notizie e Pagina. Definizione assomiglia a questo:Doctrine 2 - Ereditarietà delle tabelle di classe, selezionando per tipo

 
/** 
* Description of Page 
* @Entity 
* @InheritanceType("JOINED") 
* @DiscriminatorColumn(name="type", type="string") 
* @DiscriminatorMap({ 
* "news" = "News" , 
* "page" = "Page"}) 
* 
* @table(
* name="pages" 
*) 
*/ 
class Page extends BaseEntity {...} 
class News extends Page {...} 

lo so, come selezionare solo "notizie" soggetti - semplici SELECT ... FROM News n.

Ma c'è un modo come selezionare solo le entità "pagina", che sono mappate direttamente alla classe Page? O devo creare qualche entità extra che estende la Pagina per questo?

+0

Cosa stai cercando di fare? Non sono sicuro che tu usi l'ereditarietà di Class Table in modo corretto. –

+0

Ho una pagina di entità di base, che ha proprietà come titolo, testo, autore ecc. La notizia si estende con alcune proprietà extra come riassunto, associazione di commenti ... Probabilmente sarà possibile farlo usando l'ereditarietà di una tabella singola, ma io faccio Non penso che sia giusto approccio, perché il risultato è un grande tavolo. –

+0

Mi sono perso qualcosa? ... Perché puoi semplicemente interrogare 'SELECT * FROM Page ...'? – Cobby

risposta

0

La soluzione, che uso è che posso creare uno Switcher sulla classe entità radice Repository, in questo modo:

class PageRepository extends EntityRepository 
{ 
    protected $_switchEntityNameSave = null; 

    /** 
    * @param type $fqcn 
    */ 
    protected function _swapEntityDiscriminator($fqcn = null){ 
    if(isset($fqcn)){ 
     $this->_switchEntityNameSave = $this->_entityName; 
     $this->_entityName = $fqcn; 
    } else { 
     $this->_entityName = $this->_switchEntityNameSave; 
     unset($this->_switchEntityNameSave); 
    } 
    } 

    // ... AND TO USE... 

    public function findSomeStuff() 
    { 
    $this->_swapEntityDiscriminator(News::getFqcn()); 
    // The query, the result in a variable, $q for example 
    $this->_swapEntityDiscriminator(); 
    return $q->getQuery(); 
    } 

} 

Poi, nella classe genitore, faccio il Getter getFqcn() In questo modo:

abstract class BaseEntity { 
    /** 
    * Get fqcn 
    * 
    * Fully Qualified Class Name 
    * 
    * @return string 
    */ 
    public static function getFqcn() 
    { 
     return get_called_class(); 
    } 
    // ... 
} 

Utilizzare la funzione di associazione statica avanzata e assegnarmi il nome completo della classe sull'oggetto concreto (News o Page).

Io metto astratto, per essere sicuro di non istanziarlo.

Quello che ho anche aggiungere nelle classi concrete, alcune costanti:

class News extends Page { 
    const HUMAN_READABLE = "News"; 
    const DISCRIMINATOR = "news"; // SAME as your @DiscriminatorMap() Annotation. 

} 

In questo modo, il mio Repository posso creare cercatori specializzati solo su uno dei tipi.

Problemi correlati