问题 从$ query-> setMaxResults()获得奇怪的行为


当我在查询上调用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

编辑

在读的时候 DQL“限制”文档,我发现了以下内容:

如果您的查询包含一个fetch-joined集合,指定结果限制方法无法正常工作。设置最大结果限制数据库结果行的数量,但是对于fetch-joined集合,一个根实体可能出现在许多行中,有效地保湿少于指定数量的结果。

我很确定我没有做一个fetch-joined系列。我的印象是,我加入了一个fetch-joined系列 SELECT t, m FROM Threads JOIN t.messages。我对此的理解不正确吗?


7210
2017-09-02 22:50


起源

我刚刚注意到与学说2.2相同的问题。我很惊讶没有解决办法...... - Gregoire


答案:


更新:使用Doctrine 2.2+,您可以使用Paginator http://docs.doctrine-project.org/en/latest/tutorials/pagination.html


10
2018-02-06 21:04



不知怎的,我从来没有让这个工作(记得以前做过,但现在无法让它工作)。上周下载的Symfony和/var/www/html/Symfony/vendor/doctrine/common/lib/Doctrine/Common/Version.php告诉我它的版本是2.3.0从你的链接运行代码有很多关系给了我计数($ paginator)为2143,无论我使用的setMaxResults的值是多少。 - HMR


运用 ->groupBy('your_entity.id') 似乎解决了这个问题!


5
2017-12-01 16:29



我试过这个。起初它似乎工作但看起来它限制了fetch连接表中的结果。 - Kodos Johnson


我通过仅获取主表的内容并将所有已连接的表取出来解决了同样的问题 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();
    }
}

在我的示例回购中,您可以看到我只获取了车辆表以获得正确的结果数量。但是所有属性(如make,model,category)都会立即获取。

(我还迭代了实体内容,因为我需要将实体表示为一个数组,但这并不重要。)

这是我的实体摘录:

class Vehicles
{
    ...

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

    ...
}

它的 重要 您正确映射每个实体,否则它将无法正常工作。


1
2017-12-07 14:39