2016-01-15 9 views
5

Se in Doctrine è presente un insieme di entità associate all'associazione, è possibile che si desideri recuperare tali entità senza che vengano recuperate le associazioni mappate e rallentando la query.Come recuperare le entità senza il loro mapping delle associazioni in Doctrine 2

Ad esempio, ho un insieme di entità associate a una catena di tabelle di database collegate. Sono tutte una di queste associazioni e agiscono come una gerarchia dei prezzi nelle matrici sulle pagine dei prodotti. Essi possono essere rappresentati come così:

SitePage->SiteMatrix->SiteItems->SiteItemPrices. 

La mappatura associato funziona perfettamente, e quando uso il metodo findBy per ottenere la radice SitePage oggetto contiene matrici che rappresentano le entità mappate lungo la catena. In altre parole, l'oggetto SitePage contiene tutte le matrici, che contiene tutti gli elementi che contengono tutti i prezzi. Fin qui tutto bene.

Il mio problema è che ogni volta che ottengo un elenco di pagine sul mio sito, la dottrina sta percorrendo l'intero albero di mapping dell'associazione e mi restituisce l'intero datatabase che è molto lento. A volte voglio solo ottenere la mia entità SitePage per ID e non contenere tutte le associazioni associate.

Ho esaminato lazy loading pigro e extra di associazioni ma sembrano solo di influenzare alcune funzioni, e non findBy ecc La documentazione ufficiale è tutt'altro che utile: http://doctrine-orm.readthedocs.org/projects/doctrine-orm/en/latest/tutorials/extra-lazy-associations.html

Altre domande simili su Stack Overflow hanno andato senza risposta: Doctrine 2 Association Mapping Overhead?

C'è un modo semplice per recuperare un'entità senza le associazioni associate? Il modo più semplice che riesco a vedere attualmente è creare due entità per ogni tabella di database, una con associazione delle associazioni e una senza per l'uso nelle diverse situazioni in cui sono richieste. Mi sembra strano che tu non possa semplicemente recuperare un'entità e specificare se vuoi collegarti ad altre entità o recuperarla da sola.

Grazie per qualsiasi informazione sull'argomento.

+0

Per impostazione predefinita, Doctrine dovrebbe caricare le associazioni pigro. Sembra che tutte le tue associazioni siano impostate su un caricamento avido. Potresti aggiungere il codice per due entità con la loro associazione cartografica per escludere eventuali problemi di associazione? – JimL

+0

Grazie per la vostra risposta, ma questo problema ha più di un anno. È risultato che stavo usando un serializzatore per serializzare le mie entità in array, ed era questo serializzatore che stava chiamando ogni funzione getter lungo l'albero di mappatura delle associazioni. Una volta che ho appreso le esclusioni, la profondità massima e le funzionalità dei gruppi all'interno del pacchetto JMS Serializer, tutto è diventato chiaro e ho potuto esercitare l'associazione con un controllo molto maggiore. – Asq

risposta

2

Le strategie di esclusione JMSSerializer possono aiutarti.

In primo luogo, esclude tutte le proprietà di default:

// ... 

use JMS\Serializer\Annotation as JMS; 

/** 
* @ORM\Entity 
* @JMS\ExclusionPolicy("all") 
*/ 
class Foo 

Quindi, scegliere di escludere o esporre le vostre proprietà:

/** 
* @ORM\Column(type="string") 
* @JMS\Expose 
*/ 
protected $name; 

Inoltre, per le associazioni, è possibile utilizzare il MaxDepth per limitare il voci associate dei risultati. Esempio:

// Entity 
/** @MaxDepth(1) */ 
private $selfAssociatedEntries; 

// Controller 
use JMS\Serializer\SerializationContext; 

$serializer->serialize($data, 'json', SerializationContext::create()->enableMaxDepthChecks()); 

In questo modo, la tua volontà entità contiene il $selfAssociatedEntries serializzato, ma il $selfAssociatedEntries non avere la proprietà $selfAssociationEntries.
La serializzazione è limitata al primo oggetto padre.

Groups sono una potente funzione che consente di esporre le proprietà per alcune azioni e li esclude per un altro:

/** 
* @ORM\Column(type="string", length=255, nullable=true, unique=false) 
* @JMS\Groups({"default"}) // Set the group to expose the property 
*/ 
protected $name; 

nel controller, impostare il gruppo utilizzato per la serializzazione:

// Property 'name' is exposed 
$serializer->serialize($data, 'json', SerializationContext::create()->setGroups(array('default'))); 

Per maggiori informazioni, guarda il capitolo Exclusion Strategies della documentazione.

+0

Grazie mille per aver spiegato a fondo questo concetto. L'utilizzo delle strategie di esclusione JMSSerializer rende il mapping delle associazioni di doctrine uno strumento molto potente. Documenti ufficiali per ref - http://jmsyst.com/libs/serializer/master/cookbook/exclusion_strategies – Asq

+0

Prego, grazie per la vostra pazienza. Se hai una spiegazione migliore di maxDeprh, non esitare a dirmi e migliorerò il mio. – chalasr

+0

Questo va bene, ma questo influenza ancora la query sottostante ?, questa è la presentazione, la query deve ancora avvenire correttamente? –

Problemi correlati