2013-03-26 14 views
5

Ho un'entità Shop e un ente collegato ShopProduct, con la seguente relazione:dottrina carico supplementare pigri non funziona come previsto con conteggio

/** 
* @ORM\OneToMany(targetEntity="ShopProduct", mappedBy="shopid", fetch="EXTRA_LAZY") 
*/ 
private $products; 

In un modello rametto voglio accedere il conteggio di products, quindi accedo

{{ entity.getProducts().count }} 

Ma quando si usa il profiler di Symfony2 per guardare il numero e il contenuto delle domande, vedo che un pieno di selezione viene emesso, al posto del COUNT Mi aspetterei (basato su the documentation).

L'emissione della selezione completa per ciascuno dei valori di Shop s comporta un utilizzo della memoria di 250 MB + e un tempo di caricamento della pagina di 30+ secondi, che non è desiderato.

Dopo aver aggiunto il fetch="EXTRA_LAZY" ho eliminato le cache di dottrina.

Sto trascurando qualcosa, usando l'approccio sbagliato o fraintendendo i documenti?

[modifica]

doctrine/annotations    v1.1 
doctrine/cache      v1.0 
doctrine/collections    v1.1 
doctrine/common      2.4.0-RC1 
doctrine/data-fixtures    dev-master eef10f6 
doctrine/dbal      2.3.3 
doctrine/doctrine-bundle   v1.2.0-beta1 
doctrine/doctrine-fixtures-bundle dev-master 275540d 
doctrine/doctrine-migrations-bundle dev-master 99c0192 
doctrine/inflector     v1.0 
doctrine/lexer      v1.0 
doctrine/migrations     dev-master e1f6efc 
doctrine/orm      2.3.3 
+0

qualche suggerimento extra ramoscello: usare 'entity.products.count' invece.Questo cercherà automaticamente il modo migliore per ottenere la proprietà 'products' –

+0

Questo è quello che ho provato in origine, sfortunatamente ha lo stesso # e tipo di query e tempo di caricamento. Non riesco a immaginare che sia il modo migliore;) –

+0

@TheRookie quale versione dell'ORM stai usando? Puoi provare questo fuori dal contesto di Twig? – Ocramius

risposta

3

Non si sta utilizzando la funzione di conteggio del ramoscello ma il php interno uno come questo. Twig eseguirà le funzioni una ad una (la prima chiamata getProducts determinerà il caricamento di tutti i prodotti, quindi conterà).

{{ entity.getProducts().count }} 

Il getter viene chiamato automaticamente significato può entity.products appena uscita e utilizzare ramoscelli filtro lunghezza interna di contare il risultato ... ma il risultato è lo stesso (recupero tutti i prodotti).

{{ entity.products|length }} 

quello che stai veramente cercando è un metodo di impostazione del conteggio sul entità negozio fornito dal ShopRepository.

public function findAllAddCount() 
{ 
    $qb = $this->createQueryBuilder('s'); 
    $query = $qb 
     ->set('s.productCount', $qb->expr()->count('s.products')) 
     ->getQuery() 
    ; 

    return $query->getResult(); 
} 

... e aggiungere questo alla vostra entità:

protected $productCount; 

public function getProductCount() 
{ 
    return $this->productCount; 
} 

public function setProductCount($count) 
{ 
    $this->productCount = $count; 

    return $this; 
} 

Poi ouput il conteggio prodotto in ramoscello in questo modo:

{{ entity.productCount }} 
+0

Ciao , per quanto ne so, non esiste alcuna connessione diretta tra entità e repository. Quindi i metodi di Entity come getProductCount non ottengono risultati magici dal repository findAllAddCount(). Lo stesso con twig, devi creare un'estensione per entity.productCount. Ho dimenticato qualcosa? – d3uter

10

appena incontrato lo stesso problema e la soluzione è stata molto semplice:

{{ value.getAlerts.count() }}

invece di

{{ value.getAlerts.count }}

Ramoscello deve essere l'override del metodo Dottrina count() scopo di "Lazy Load Extra" con una variante di essa la propria applicazione che recupera solo in silenzio tutte le entità di contarli.

Quello girato tutte le query * Selezionare previste nello COUNT (*) ...

+0

Sembra che questo sia qualcosa che Twig dovrebbe risolvere giusto? Puoi segnalare i tuoi risultati? – Rvanlaak

Problemi correlati