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?
Acabo de notar el mismo problema con la doctrina 2.2. Estoy sorprendido de que no haya una solución para eso ... – Gregoire