Symfony 2:使用 doctrine 查询生成器对非相关表进行内部连接

2022-08-30 11:19:28

我正在尝试使用 doctrine 查询生成器构建一个查询,该查询构建器连接了一个不相关的表,如下所示:

$query = $this->createQueryBuilder('gpr')
        ->select('gpr, p')
        ->innerJoin('TPost', 'p')
        ->where('gpr.contentId = p.contentId')

但这行不通。我仍然收到一个错误:

错误:标识变量 TPost 用于联接路径表达式,但之前未定义。

我搜索了这个错误消息,每个人都回答使用表别名+属性,如p.someAttribute。但是,我要加入的表在我开始选择的表中不相关。

作为一个普通的mysql查询,我会这样写:

SELECT * FROM t_group_publication_rel gpr 
INNER JOIN t_post p 
WHERE gpr.content_id = p.content_id

任何想法,我做错了什么?


答案 1

今天我正在处理类似的任务,并记得我打开了这个问题。我不知道它从哪个教义版本开始工作,但现在你可以很容易地在继承映射中加入子类。因此,像这样的查询可以毫无问题地工作:

$query = $this->createQueryBuilder('c')
        ->select('c')
        ->leftJoin('MyBundleName:ChildOne', 'co', 'WITH', 'co.id = c.id')
        ->leftJoin('MyBundleName:ChildTwo', 'ct', 'WITH', 'ct.id = c.id')
        ->orderBy('c.createdAt', 'DESC')
        ->where('co.group = :group OR ct.group = :group')
        ->setParameter('group', $group)
        ->setMaxResults(20);

我在使用继承映射的父类中启动查询。在我之前的文章中,这是一个不同的起点,但如果我记得正确,也是同样的问题。

因为当我开始这个问题时,这是一个大问题,所以我认为对于其他不了解它的人来说,它也可能很有趣。


答案 2

在没有关联的实体之间联接直到 2.4 版才有可能,在 2.4 版中,您可以使用以下语法生成任意联接:

$query = $em->createQuery('SELECT u FROM User u JOIN Blacklist b WITH u.email = b.email');

参考资料: http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/dql-doctrine-query-language.html


推荐