Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Symfony 2:使用条令查询生成器对非相关表进行内部联接_Php_Mysql_Symfony_Doctrine_Query Builder - Fatal编程技术网

Php Symfony 2:使用条令查询生成器对非相关表进行内部联接

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_

我正在尝试使用doctrine query builder构建一个查询,它连接一个不相关的表,如下所示:

$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
。这对于复杂的统计数据很有用。