当我在查询上调用setMaxResults时,似乎想要将最大数量视为“2”,无论它的实际值是什么。
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;
}
当我注释掉setMaxResults
行时,我会得到6个结果。当我离开时,我得到了最近的2个结果。当我在phpMyAdmin中运行生成的SQL代码时,我得到了4个最新的结果。生成的SQL供参考:
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
修改:
在阅读the DQL "Limit" documentation时,我发现了以下内容:
如果您的查询包含一个fetch-joined集合,指定结果限制方法无法正常工作。设置最大结果限制了数据库结果行的数量,但是对于fetch-joined系列,一个根实体可能出现在很多行中,有效地保湿少于指定数量的结果。
我很确定我没有做一个fetch-joined系列。我的印象是fetch-joined系列是我SELECT t, m FROM Threads JOIN t.messages
之类的地方。我对此的理解不正确吗?
答案 0 :(得分:10)
更新:使用Doctrine 2.2+,您可以使用Paginator http://docs.doctrine-project.org/en/latest/tutorials/pagination.html
答案 1 :(得分:6)
使用->groupBy('your_entity.id')
似乎解决了这个问题!
答案 2 :(得分:1)
我通过仅提取主表的内容并将所有已连接的表提取为fetch="EAGER"
来解决相同的问题,该表在实体中定义(此处描述为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();
}
}
在我的示例回购中,您可以看到我只获取了车辆表以获得正确的结果数量。但是所有属性(如品牌,型号,类别)都会立即获取。
(我还迭代了实体内容,因为我需要将实体表示为数组,但这不应该是非常重要的。)
这是我实体的摘录:
class Vehicles
{
...
/**
* @ManyToOne(targetEntity="Makes", fetch="EAGER")
* @var Makes
*/
public $make;
...
}
重要,您可以正确映射每个实体,否则无法正常工作。