2011-09-02 12 views
11

Cuando llamo a setMaxResults en una consulta, parece querer tratar el número máximo como "2", sin importar su valor real.

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; 
} 

Cuando comento hacia fuera de la línea de setMaxResults, me sale 6 resultados. Cuando lo dejo, obtengo los 2 resultados más recientes. Cuando ejecuto el código SQL generado en phpMyAdmin, obtengo los 4 resultados más recientes. El SQL generado, como referencia, es:

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 

Edición:

Durante la lectura de the DQL "Limit" documentation, me encontré con lo siguiente:

Si la consulta contiene una fetch- colección unida que especifica que los métodos de límite de resultados no funcionan como era de esperar. Establecer resultados máximos restringe el número de filas de resultados de la base de datos, sin embargo, en el caso de recolecciones unidas, una entidad raíz puede aparecer en muchas filas, hidratando efectivamente menos del número especificado de resultados.

Estoy bastante seguro de que no estoy haciendo una colección unida a fetch. Tengo la impresión de que una colección unida a fetch es donde hago algo como SELECT t, m FROM Threads JOIN t.messages. ¿Soy incorrecto en mi comprensión de esto?

+0

Acabo de notar el mismo problema con la doctrina 2.2. Estoy sorprendido de que no haya una solución para eso ... – Gregoire

Respuesta

10

Una actualización con la doctrina 2.2+ puede utilizar el Paginator http://docs.doctrine-project.org/en/latest/tutorials/pagination.html

+1

De alguna manera nunca logro que esto funcione (recuerde hacerlo antes, pero no pude hacerlo funcionar ahora). Descargué Symfony la semana pasada y /var/www/html/Symfony/vendor/doctrine/common/lib/Doctrine/Common/Version.php me dice que es la versión 2.3.0 Ejecutar el código de su enlace con una relación de muchos a muchos me da un conteo ($ paginator) de 2143 sin importar el valor de setMaxResults que uso. – HMR

1

Resolví el mismo problema solo obteniendo el contenido de la tabla maestra y teniendo todas las tablas unidas recuperadas como fetch="EAGER" que se define en la Entidad (descrita aquí 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(); 
    } 
} 

En mi repo de ejemplo, puede ver que solo fui a la mesa del vehículo para obtener el resultado correcto. Pero todas las propiedades (como marca, modelo, categoría) se obtienen de inmediato.

(. También reiteró sobre la entidad-contents porque necesitaba la entidad representada como una matriz, pero eso no debería importar que yo sepa)

He aquí un extracto de mi entidad:

class Vehicles 
{ 
    ... 

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

    ... 
} 

Es important que mapea cada Entidad correctamente, de lo contrario no funcionará.

5

Usando ->groupBy('your_entity.id') parecen resolver el problema!

+0

Acabo de probar esto. Al principio, pareció funcionar, pero parece que está limitando los resultados en las tablas de obtención de enlaces. –

Cuestiones relacionadas