2014-12-02 16 views
5

Diciamo che ho un'entità Post e un'entità Commento. Un commento può essere approvato o meno da un amministratore (che è una bandiera nel db). L'entità post ha:Relazione condizionale in Symfony2

/** 
* @ORM\OneToMany(targetEntity="Comment", mappedBy="post") 
*/ 
protected $comments; 

E voglio anche un secondo attributo, che sarà simile:

/** 
* @ORM\OneToMany(targetEntity="Comment", mappedBy="post") 
*/ 
protected $approvedComments; 

Come è possibile caricare solo i commenti approvati qui?

+0

Solo caricando solo quelli approvati?Non ho davvero il tuo problema. Puoi espandere un po 'come lo stai caricando? Repository? Controllore? – Koalabaerchen

+0

Attualmente non sto caricando i Commenti approvati, sto chiedendo un bel modo per farlo. –

risposta

1

Idea # 1

Si potrebbe utilizzare Inheritance mapping: http://doctrine-orm.readthedocs.org/en/latest/reference/inheritance-mapping.html

L'idea sarebbe di avere classi separate per ogni tipo (approvati e non approvati), ma per memorizzare tutto in una singola tabella (SINGLE_TABLE eredità).

Sarà necessario disporre di una colonna aggiuntiva che memorizzerà il discriminatore di classe.

Poi, si dovrebbe:

/** 
* @ORM\OneToMany(targetEntity="ApprovedComment", mappedBy="post") 
*/ 
protected $approvedComments; 

/** 
* @ORM\OneToMany(targetEntity="NonApprovedComment", mappedBy="post") 
*/ 
protected $nonApprovedComments; 

Lo svantaggio evidente è la creazione di classi aggiuntive.

Idea # 2

si potrebbe semplicemente modificare si Query/QueryBuilder come:

`SELECT p, c FROM AcmeDemoBundle:Post p LEFT JOIN p.comments c WITH c.approved = FALSE` 

Questa idea sembra più ragionevole.

1

Questo non può essere raggiunto attraverso le relazioni come lo descrivete. 2 tabelle non possono essere correlate "condizionalmente" in quanto le relazioni sono basate su chiavi primarie.

di avere almeno soluzioni qui

  1. Lasciare il campo "commenti" sull'entità con le annotazioni, rimuovere le annotazioni dal campo commenti approvato in quanto è lo stesso di commenti come inteso dalla ORM. Avresti quindi la funzione -> getComments() per ottenere tutti i commenti e potresti aggiungere una funzione "getApprovedCommentsForPost ($ post)" nella classe del tuo repostere per recuperare quelli approvati.
  2. È possibile distinguere tra i commenti con ereditarietà singola, in modo da avere una classe Commento e una classe ApprovedComment in una tabella, ad esempio, quindi è possibile creare 2 relazioni sulla propria entità (leggi qui doctrine-orm.readthedocs.org/en /latest/reference/inheritance-mapping.html#single-table-inheritance)
  3. Si potrebbe utilizzare filtri dottrina per filtrare i commenti approvati per impostazione predefinita quando il recupero dei dati dal repository commenti
+0

Grazie per le soluzioni fornite, una domanda, sulla prima soluzione che suggerisci di chiamare un repository dall'interno di un'entità? Anche se questo non è buono o addirittura possibile .. Puoi spiegare come? –

+0

No, quello che intendo è che si recuperano i commenti separatamente. Quindi per prima cosa ottieni l'oggetto Post dal repository Post e poi, separatamente, per esempio nella tua azione, fai qualcosa come $ doctrine-> getRepository ('... Comment') -> getApprovedForPost ($ post) o -> getApprovedForPosts ($ arrayOfPostIds) –

+0

Aha Ho capito ora, ma questo creerà un problema di prestazioni. Come voglio recuperare molti post con i loro commenti approvati per una pagina. Controllando ora le altre due soluzioni :) –