45

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

$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

任何想法我做错了什么?

4

4 回答 4

94

今天我正在处理类似的任务,并记得我打开了这个问题。我不知道它是从哪个学说版本开始工作的,但现在您可以轻松地将子类加入继承映射中。所以像这样的查询没有任何问题:

$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);

我在使用继承映射的父类中开始查询。在我之前的帖子中,如果我没记错的话,这是一个不同的起点,但同样的问题。

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

于 2013-05-28T11:06:20.827 回答
12

在版本 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

于 2016-09-04T23:09:21.857 回答
3
$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();
于 2013-10-20T14:56:32.757 回答
1

只有在映射中定义了关联时,DQL 连接才有效。在您的情况下,我会说执行本机查询并使用ResultSetMapping填充您的对象要容易得多。

于 2012-06-27T19:41:12.427 回答