在zf2和Doctrine2中编写连接查询查询

时间:2014-02-25 07:49:56

标签: php sql doctrine-orm zend-framework2

我在zf2和doctrine orm中有一个查询。我正在通过其primary_key在同一个表上加入两个查询的结果。

看来,我正在制作语法错误而无法找到答案。

$query = $this->getEntityManager()->createQuery(
    "select tc_result1.id as id ,tc_result1.displayId as displayId,tc_result1.activeFlag,tc_result1.hash
        from
        (
            SELECT *
            FROM (
                    SELECT id, display_id,active_flag,hash
                    FROM Test\Entity\TestCase tc_inner1
                    where tc_inner1.activeFlag=0 and tc_inner1.product = :productId
                    ORDER BY tc_inner1.displayId DESC
                 ) a
            GROUP BY hash 
        ) AS tc_result1

        join

        (
            SELECT *
            FROM (
                    SELECT id, displayId,activeFlag,hash
                    FROM Test\Entity\TestCase tc_inner2
                    where tc_inner2.activeFlag=0 and tc_inner2.product = :productId
                    ORDER BY tc_inner2.displayId DESC
                 ) a
            GROUP BY hash 
        ) AS tc_result2
        on
        tc_result1.id = tc_result2.id"
   );
$query->setParameter("productId", $productId);

我收到了以下错误:

  

其他信息:Doctrine \ ORM \ Query \ QueryException文件:       /var/www/test-suite/vendor/doctrine/orm/lib/Doctrine/ORM/Query/QueryException.php:63

     

消息:

[Semantical Error] line 0, col 153 near '(': Error: Class '(' is not defined.

2 个答案:

答案 0 :(得分:3)

我昨天在doctrine-user mailinglist上给出类似问题的答案也适用于此:

  

你在做什么错误这里是:定义一个ON子句。那   是你如何在SQL中做到这一点。但是在DQL中,您可以定义关系   在映射信息中的实体之间(通过注释,   xml,yaml或php)并在查询中使用该关系。所以:   定义OneToOne,OneToMany,ManyToOne或ManyToMany关系和   在查询中使用它(因此不需要使用ON)。

相关(来自同一个主题):

  

你不是用DQL查询表,而是查询实体!该   实体(对象)形成一个网络,即对象图。你能走”   那个图。查询中未定义关联(使用ON或   在哪里),但在映射。这是ORM的重点;   否则没有必要使用它,你可以更好   用SQL直接查询数据库。

答案 1 :(得分:1)

我遇到了问题。 Doctrine查询Entity类而不是表。它需要一个实体类

select tc_result1.id as id ,tc_result1.displayId as displayId,tc_result1.activeFlag,tc_result1.hash
                from
                (

此问题的解决方案是使用 ResultSetMappingBuilder 对象,使用该对象我们可以在本机sql中编写查询并将结果映射到doctrine对象