如何使用Doctrine(DQL)限制左连接的结果

ArG*_*rGh 4 doctrine left-join limit

在symfony 2应用程序中,我有2个实体,由oneToMany关系(用户和集合点)映射.我正在尝试搜索我的用户实体并加入找到的每个用户的最后一个集合点.这个想法是这样的:

    $qb = $this->createQueryBuilder('p');

    $qb->select('p.id, p.last_name, p.first_name')
       ->leftJoin('p.rendezvous', 'i')
            ->select('i.date')
            ->where('i.user = p.user')
            ->orderBy('i.date', 'DESC')
            ->setFirstResult(0)
            ->setMaxResults(1)                
       ->where('p.user IN ('.$users.')')
       ->orderBy('p.last_name', 'ASC')
       ->addOrderBy('p.first_name', 'ASC');
Run Code Online (Sandbox Code Playgroud)

我应该得到如下结果:

1,Ben,Tooch,2014-10-15 18:45:00
7,John,Snow,2014-10-16 17:15:00
...

我试图使用paginator函数但没有任何成功.
非常感谢您的帮助.

ArG*_*rGh 6

当我添加更多列时,我必须找到另一种方法来实现它.我终于得到了一个有效的DQL查询:

$qb->select('p.id, p.last_name, p.first_name, r.date, r.othercolumn')
    ->leftJoin('p.rendezvous', 'r', 'WITH', 'p.id = r.user AND r.date = (SELECT MAX(r2.date) FROM \App\YourBundle\Entity\Rendezvous as r2 WHERE r2.user = p.id)')               
    ->where('p.user IN ('.$users.')')
    ->orderBy('p.last_name', 'ASC')
    ->addOrderBy('p.first_name', 'ASC')
    ->groupBy('p.id');
Run Code Online (Sandbox Code Playgroud)