2011-09-02 12 views
11

Quando si chiama setMaxResults su una query, sembra che si desideri trattare il numero massimo come "2", indipendentemente dal valore effettivo.

function findMostRecentByOwnerUser(\Entities\User $user, $limit) 
{ 
    echo "2: $limit<br>"; 
    $query = $this->getEntityManager()->createQuery(' 
     SELECT t 
     FROM Entities\Thread t 
     JOIN t.messages m 
     JOIN t.group g 
     WHERE 
      g.ownerUser = :owner_user 
     ORDER BY m.timestamp DESC 
    '); 
    $query->setParameter("owner_user", $user); 
    $query->setMaxResults(4); 
    echo $query->getSQL()."<br>"; 
    $results = $query->getResult(); 
    echo "3: ".count($results); 
    return $results; 
} 

Quando commento la riga setMaxResults, ottengo 6 risultati. Quando lo lascio, ottengo i 2 risultati più recenti. Quando eseguo il codice SQL generato in phpMyAdmin, ottengo i 4 risultati più recenti. L'SQL generato, per riferimento, è:

SELECT <lots of columns, all from t0_> 
FROM Thread t0_ 
INNER JOIN Message m1_ ON t0_.id = m1_.thread_id 
INNER JOIN Groups g2_ ON t0_.group_id = g2_.id 
WHERE g2_.ownerUser_id = ? 
ORDER BY m1_.timestamp DESC 
LIMIT 4 

Edit:

Durante la lettura the DQL "Limit" documentation, mi sono imbattuto nel seguente:

Se la query contiene un fetch- la raccolta congiunta che specifica i metodi del limite dei risultati non funziona come ci si aspetterebbe. Imposta risultati massimi limita il numero di righe di risultati del database, tuttavia, nel caso di raccolte fetch-join, un'entità radice potrebbe apparire in più righe, in pratica idratando meno del numero specificato di risultati.

Sono abbastanza sicuro che non sto facendo una collezione di fetch-uniti. Ho l'impressione che una collezione raccolta fetch sia dove faccio qualcosa come SELECT t, m FROM Threads JOIN t.messages. Sono errato nella mia comprensione di questo?

+0

Ho appena notato lo stesso problema con doctrine 2.2. Sono sorpreso che non ci sia soluzione per questo ... – Gregoire

risposta

10

Un aggiornamento: Con Dottrina 2.2+ è possibile utilizzare il Paginator http://docs.doctrine-project.org/en/latest/tutorials/pagination.html

+1

In qualche modo non riesco mai a farlo funzionare (ricordati di farlo prima ma non riuscivo a farlo funzionare ora). Scaricato Symfony la scorsa settimana e /var/www/html/Symfony/vendor/doctrine/common/lib/Doctrine/Common/Version.php mi dice che è la versione 2.3.0 Esecuzione del codice dal tuo link con una relazione molti a molti mi dà un conteggio ($ paginator) di 2143 indipendentemente dal valore di setMaxResults che utilizzo. – HMR

1

Ho risolto lo stesso problema recuperando solo il contenuto della tabella principale e avendo tutte le tabelle unite recuperate come fetch="EAGER" che è definito nell'entità (descritto qui http://www.doctrine-project.org/docs/orm/2.1/en/reference/annotations-reference.html?highlight=eager#manytoone).

class VehicleRepository extends EntityRepository 
{ 
    /** 
    * @var integer 
    */ 
    protected $pageSize = 10; 

    public function page($number = 1) 
    { 
     return $this->_em->createQuery('SELECT v FROM Entities\VehicleManagement\Vehicles v') 
      ->setMaxResults(100) 
      ->setFirstResult($number - 1) 
      ->getResult(); 
    } 
} 

Nel mio repo di esempio è possibile vedere ho recuperato solo la tabella del veicolo per ottenere l'importo corretto del risultato. Ma tutte le proprietà (come marca, modello, categoria) vengono acquisite immediatamente.

(. Ho anche iterata sull'ente-contents perché avevo bisogno di entità rappresentata come un array, ma che non dovrebbe importare afaik)

Ecco un estratto dal mio ente:

class Vehicles 
{ 
    ... 

    /** 
    * @ManyToOne(targetEntity="Makes", fetch="EAGER") 
    * @var Makes 
    */ 
    public $make; 

    ... 
} 

È importante che si esegue il mapping di ogni entità correttamente altrimenti non funzionerà.

5

Utilizzando ->groupBy('your_entity.id') sembrano risolvere il problema!

+0

Ho appena provato questo. All'inizio sembrava funzionare ma sembra che limiti i risultati nelle tabelle unite di recupero. –

Problemi correlati