一尘不染

在Doctrine中左联接ON条件和其他条件语法

mysql

我在Symfony2中使用Doctrine的querybuilder创建查询以获取实体。

我当前的代码如下所示:

$repository = $this->getDoctrine()->getRepository('AaaBundle:Application');

    $queryBuilder = $repository->createQueryBuilder('a');
    $queryBuilder
        ->addSelect('u')
        ->addSelect('i')
        ->orderBy('a.created_date', 'DESC')
        ->leftJoin('a.created_by', 'u')
        ->leftJoin('a.installations', 'i')
        //->where('i.page = :page')
        //->setParameter('page', $found)
        ;

现在,我可以使用它来获取所有页面,而不管它们是否已安装。但我只想将其加入$found页面即可(因此,如果有该应用程序的安装,但在其他页面上,则不会加入该安装)。如果我取消对where子句的引用,它将仅显示已安装该页面的应用程序。我希望该页面具有或没有安装的所有应用程序。

在SQL中,我可以通过添加AND到联接

LEFT JOIN installations i ON a.id = i.app AND i.page = :page

这样,我可以获得在页面上已安装的应用程序的安装信息,但是在其他页面上已安装或根本没有安装的应用程序的列上,我会得到空值。

有没有办法在Doctrine中做到这一点,还是我最好只是为每个应用程序获取所有安装,然后使用php对找到的页面进行检查?


阅读 227

收藏
2020-05-17

共1个答案

一尘不染

您可以尝试以下方法:

use Doctrine\ORM\Query\Expr;

->leftJoin('a.installations', 'i', Expr\Join::WITH, 'i.page = :page')
->setParameter('page', $page)

请参阅左函数加入文档:http
://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/query-
builder.html#high-level-api-methods

2020-05-17