Php Symfony 2:使用条令查询生成器对非相关表进行内部联接
我正在尝试使用doctrine query builder构建一个查询,它连接一个不相关的表,如下所示:Php Symfony 2:使用条令查询生成器对非相关表进行内部联接,php,mysql,symfony,doctrine,query-builder,Php,Mysql,Symfony,Doctrine,Query Builder,我正在尝试使用doctrine query builder构建一个查询,它连接一个不相关的表,如下所示: $query = $this->createQueryBuilder('gpr') ->select('gpr, p') ->innerJoin('TPost', 'p') ->where('gpr.contentId = p.contentId') SELECT * FROM t_group_publication_
$query = $this->createQueryBuilder('gpr')
->select('gpr, p')
->innerJoin('TPost', 'p')
->where('gpr.contentId = p.contentId')
SELECT * FROM t_group_publication_rel gpr
INNER JOIN t_post p
WHERE gpr.content_id = p.content_id
但这不起作用。我仍然得到一个错误:
错误:在联接路径表达式中使用了标识变量TPost,但之前未定义
我搜索了这个错误消息,每个人都回答使用表别名+属性,比如p.someAttribute。但是我要加入的表在我开始选择的表中不相关
作为一个普通的mysql查询,我会这样写:
$query = $this->createQueryBuilder('gpr')
->select('gpr, p')
->innerJoin('TPost', 'p')
->where('gpr.contentId = p.contentId')
SELECT * FROM t_group_publication_rel gpr
INNER JOIN t_post p
WHERE gpr.content_id = p.content_id
知道我做错了什么吗?只有在映射中定义了关联时,DQL联接才起作用。在您的情况下,我要说的是,执行本机查询并使用它填充对象要容易得多。今天我正在处理类似的任务,记得我打开了这个问题。我不知道它是哪一个版本,但现在您可以很容易地在继承映射中加入子类。这样的查询可以毫无问题地工作:
$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.4版之前,没有关联的实体之间的连接是不可能的,在2.4版之前,您可以使用以下语法生成任意连接:
$dql = "SELECT
a, md.fisrtName , md.LastName, mj
FROM MembersBundle:Memberdata md
INNER JOIN MembersBundle:Address a WITH md = a.empID
INNER JOIN MembersBundle:Memberjob mj WITH md = mj.memberData
...
WHERE
a.dateOfChange IS NULL
AND WHERE
md.someField = 'SomeValue'";
return $em->createQuery( $dql )->getResult();
$query = $em->createQuery('SELECT u FROM User u JOIN Blacklist b WITH u.email = b.email');
参考:我们可以使用DQL执行与无关对象的连接吗?我不知道。如果可能的话,它是有趣的=)。如果你想加入它们,为什么不在这两者之间建立一个关系呢?在这种情况下,一个关系是不够的。我需要与3个不同表的关系,任何记录都只能将引用设置为这3个表中的1个。如果我在控制器中使用find方法而不是构建查询,是否会比较慢?我会说是的,因为在后台有更多的查询,对吗?所以我的意思是不仅仅只有一个find方法。两个不同的发现组合在一个循环中。谢谢!这真的很有帮助,我已经搜索了几个小时。如果我没有
MyBundleName:ChildTwo
存储库,我想用表名编写查询,那么解决方案是什么?@MohammadFared对实体的引用不是存储库,它是“:”形式的字符串或实体类的FQCN,例如.\AppBundle\Entity\ChildTwo::CLASS虽然这个答案没有提供所需的细节,但没有什么可以引用的,因为条令的文档完全没有涵盖这些类型的连接。这对我有用。我知道足够多的sql来解析意图,而没有足够的条令来连接点。这太棒了!请注意,在这种情况下需要WITH
子句,否则会导致语法错误。但是,您可以只使用一个伪条件,并从本质上获得一个真正的交叉连接,而DQL不支持这种交叉连接。例如:从用户u中选择u,然后用0=0加入项目i
。这对于复杂的统计数据很有用。