【问题标题】:Symfony2 bad response from query with maxresults and firstresultSymfony2 来自 maxresults 和 firstresult 查询的错误响应
【发布时间】:2015-02-01 11:21:20
【问题描述】:

我遇到了 setMaxResultsetFirstResult 的严重问题。

当我尝试在没有 setMaxResultssetFirstResult 的情况下获得结果时,它可以正常工作,返回所有行。

当我使用 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()-&gt;getSql() 来获取原始sql,并查看查询的limit 子句中的值是什么
  • 我已经尝试使用 getSql() 并在 mysql 中执行它......它工作正常......
  • Limit 是一个 sql 函数,作用于返回的 sql 记录总数。不幸的是,根对象的数量并非如此。因此,如果一个事件有多个符合条件的圈子,则限制将无法按预期工作。这只是 sql 的工作方式。我知道的唯一解决方法是首先查询 eventIds(限制将正常工作),然后进行第二次查询以获取这些 id 的数据。在某些情况下,您可以使用嵌套查询来获得相同的结果。
  • 谢谢塞拉德。有效。你能正常回复这篇文章吗(不加评论)。我会给你正确的答案!

标签: php mysql symfony doctrine-orm


【解决方案1】:

关于当您在查询中有联接时 sql-limit 没有用处,Cerad 是正确的。

如果您想在使用 Doctrine2 时进行分页,可以使用一些有用的工具。

在此处查看文档: http://doctrine-orm.readthedocs.org/en/latest/tutorials/pagination.html

您需要一些额外的代码,但大多数复杂的东西都会为您处理。 它还需要 1 或 2 个额外的查询才能找到正确的记录 + 数据。在您的情况下,这可能是问题,也可能不是问题。

【讨论】:

    猜你喜欢
    • 2015-06-24
    • 1970-01-01
    • 1970-01-01
    • 2013-09-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-16
    • 1970-01-01
    相关资源
    最近更新 更多