2011-11-21 4 views
16

Sto lavorando su un sito di eventi e hanno un uno a molti relazione tra una produzione e le sue prestazioni, quando ho un oggetto di prestazioni se ho bisogno di suo ID di produzione in questo momento devo fareÈ possibile ottenere una chiave esterna da un oggetto in Doctine2 senza caricare quell'oggetto?

$productionId = $performance->getProduction()->getId(); 

Nei casi in cui ho letteralmente bisogno solo dell'ID di produzione, sembra uno spreco inviare una query di un altro database per ottenere un valore già presente nell'oggetto da qualche parte. C'è un modo per aggirare questo?

+3

Ottima domanda: mi imbatto sempre e mi piacerebbe trovare un modo per accedere direttamente al valore della chiave esterna senza dover partecipare all'associazione ogni volta. – cantera

risposta

27

Modifica 2013.02.17:
Quello che ho scritto di seguito non è più vero. Non devi fare nulla nello scenario descritto nella domanda, perché Doctrine è abbastanza intelligente da caricare i campi id in entità correlate, quindi gli oggetti proxy conterranno già l'id, e non invierà un'altra chiamata a il database.

risposta obsolete di seguito:

E 'possibile, ma è sconsigliato.

La ragione di questo, è che Doctrine cerca di aderire al principio che le entità dovrebbero formare un oggetto grafico, dove le chiavi esterne non hanno posto, perché sono solo "artefatti", che provengono dal modo in cui i database relazionali lavoro.

Si dovrebbe riscrivere l'associazione di essere

  • desiderosi caricato, se è sempre necessario l'entità correlata
  • scrivere una query DQL (preferibilmente su un Repository) per andare a prendere-join l'entità correlata
  • lasciarlo pigro caricare l'entità correlata chiamando un getter su di esso

Se non sei convinto, e vuoi davvero evitare tutto quanto sopra, ci sono due modi (che io sappia), per ottenere id di un oggetto correlato, senza attivare un carico e senza ricorrere a trucchi come riflessione e serializzazione:

Se si dispone già dell'oggetto in mano, è possibile recuperare l'oggetto interno UnitOfWork che Doctrine utilizza internamente e utilizzarlo getEntityIdentifier(), passando l'entità non caricata (l'oggetto proxy). Ti restituirà l'id, senza attivare il carico pigro.

Supponendo di avere molti-a-uno relazione, con più articoli appartenenti a una categoria:

$articleId = 1; 
$article = $em->find('Article', $articleId); 
$categoryId = $em->getUnitOfWork()->getEntityIdentifier($article->getCategory()); 

Venendo 2.2, si sarà in grado di utilizzare la funzione DQL IDENTITÀ, per selezionare solo una chiave esterna, In questo modo:

SELECT IDENTITY(u.Group) AS group_id FROM User u WHERE u.id = ?0 

È lo already committed per le versioni di sviluppo.

Ancora, dovresti davvero provare a seguire uno dei metodi "corretti".

+0

Grazie per la tua risposta, ti ho appena provato e ha funzionato perfettamente!Il tipo di situazione che voglio fare è, ad esempio, generare raccomandazioni, ho un certo numero di prestazioni e ho bisogno degli ID di produzione, così posso passarli a un oggetto che genererà le raccomandazioni basate sugli ID di produzione. Quindi sembra un po 'inutile caricare le produzioni quando non ne ho bisogno e non voglio davvero avere due versioni del mio sistema di raccomandazione. Prendo il tuo punto sull'uso del sistema corretto ma in questo caso afferrare gli id ​​sembra il modo più semplice. – pogo

+3

Esistono molti casi d'uso, in cui è sufficiente l'ID di un oggetto correlato. Penso che per motivi di ottimizzazione delle prestazioni è consigliabile rompere con il concetto di OOP. È alla fine solo un'assistenza che non dovrebbe rallentare la tua applicazione. Sono grato per le soluzioni Noberts ma non con lui sulla sua posizione concettuale. – bekay