【发布时间】:2015-02-01 11:21:20
【问题描述】:
我遇到了 setMaxResult 和 setFirstResult 的严重问题。
当我尝试在没有 setMaxResults 和 setFirstResult 的情况下获得结果时,它可以正常工作,返回所有行。
当我使用 offset = 0 和 limit=10 时,效果很好,返回 10 行。
当我使用 offset = 10 和 limit = 10 时,它返回 5 行(必须是 7)
另一个例子,我使用了 offset = 0 , limit = 20 ,它返回 15 行。但它必须是 17 行。
在 offset=0 和 limit = 30 的情况下,它返回了所有 17 行......为什么这个查询效果这么差?偏移量 = 0 和限制 20,它应该返回所有 17 行......但不是 15..
代码:
$eligibleCircles = $this->getAllCircles($user);
$results = $this->getEntityManager()
->createQuery(
'SELECT
e
FROM
TestBundle:Event e
LEFT JOIN
e.eligibleCircles eligibleCircles
WHERE
(
eligibleCircles in (:eligibleCircles)
OR
e.owner = :user
)
AND
e.eventStatus = :eventStatus
AND
NOT EXISTS (
SELECT
eh
FROM
TestBundle:EventHidden eh
WHERE
eh.user = :user
AND
eh.event = e
)
AND
e.startDate < :currentDate
ORDER BY e.startDate DESC
'
)
->setParameter('eventStatus', 3)
->setParameter('eligibleCircles', $eligibleCircles )
->setParameter('user', $user )
->setParameter('currentDate', new \DateTime('now') )
->setFirstResult($offset)
->setMaxResults($limitNr)
->getResult();
【问题讨论】:
-
您是否在 mysql/postgresql 中测试了原始 SQL 查询?有可能,您的查询是在数据库级别而不是由 ORM 引起的这种行为
-
通过将
getResult()替换为getQuery()->getSql()来获取原始sql,并查看查询的limit 子句中的值是什么 -
我已经尝试使用 getSql() 并在 mysql 中执行它......它工作正常......
-
Limit 是一个 sql 函数,作用于返回的 sql 记录总数。不幸的是,根对象的数量并非如此。因此,如果一个事件有多个符合条件的圈子,则限制将无法按预期工作。这只是 sql 的工作方式。我知道的唯一解决方法是首先查询 eventIds(限制将正常工作),然后进行第二次查询以获取这些 id 的数据。在某些情况下,您可以使用嵌套查询来获得相同的结果。
-
谢谢塞拉德。有效。你能正常回复这篇文章吗(不加评论)。我会给你正确的答案!
标签: php mysql symfony doctrine-orm