2012-11-12 18 views
6

Sto utilizzando Doctrine 2.2.2 cercando di eseguire una query per un'entità utente insieme alla società dell'utente. Voglio che questa query venga memorizzata nella cache poiché i dati all'interno non cambieranno spesso, se non del tutto. Qui di seguito è quello che ho provato:La cache dei risultati di Doctrine non memorizza nella cache una query con un join

$user = $em->createQuery(' 
    SELECT u, c 
    FROM Entities\User u 
    LEFT JOIN u.company c 
    WHERE u.id = :id 
')->setParameter('id', $identity)->useResultCache(true, 21600, 'user_' . $identity)->getResult(); 

Apparentemente, l'entità utente viene memorizzato nella cache, ma lo fa ancora una query per l'azienda. C'è un modo che posso recuperare entrambi nello stesso momento e metterli nella cache dei risultati?

Ho trovato this, ma è molto vecchio e la sua soluzione non ha funzionato per me.

Mi è stato suggerito di eseguire this, ma questo tipo di sconfigge lo scopo della cache dei risultati.

+0

non so dottrina, ma si può dare mysql cache interna una prova: SELEZIONE SQL_CACHE u, c dalle entità \ User u LEFT JOIN u.company c DOVE u.id =: id – nfo

+0

Questo non è utile. Voglio essere in grado di usare tutte le cose dell'entità di Doctrine. – tubaguy50035

+1

Provare a forzare il recupero di EAGER (anziché il pigro). Devi aggiungere fetch = "EAGER" alla tua definizione di relazione. – Cyprian

risposta

1

Ho provato questo con Doctrine 2.3 utilizzando:

$q->setResultCacheDriver(new \Doctrine\Common\Cache\ApcCache()) 
    ->setResultCacheLifetime(21600) 
    ->setResultCacheId('user_' . $identity); 

Quando eseguo la prima volta, vedo la query effettiva nel mio sql-logger.
Quando eseguo il secondo, il terzo, ecc., Non vedo nulla nel mio sql-logger.

La mia conclusione è che funziona bene.

Immagino che tu non abbia una cache dei risultati configurata, o che tu abbia una cache dei risultati non permanente (come ArrayCache) configurata, o che sia un bug in Dontrine 2.2.2 (anche se non riesco a trovare niente a riguardo su jira).

PS: Ho raccolto da un'altra domanda (Doctrine detaching, caching, and merging) che hai aggiornato a Doctrine 2.3. Hai ancora questo problema?

PPS: da qualche parte dopo Doctrine 2.0 (penso fosse 2.2), la cache dei risultati è cambiata. Invece di mettere in cache il risultato idratato, il risultato sql viene memorizzato nella cache (e l'idratazione avviene ogni volta). Se si desidera memorizzare nella cache il risultato idratato, sarà necessario utilizzare la cache di idratazione (ma si tenga presente che tali risultati sono non uniti in EntityManager).

+0

La mia soluzione è stata creare la mia "cache dei risultati". Ecco di cosa tratta l'altra domanda. – tubaguy50035

Problemi correlati