2013-02-13 90 views
4

我想做一个DQL查询,如:doctrine2 DQL子查询1行限制

$dql = "select p 
     from AcmeDemoBundle:UserTypeA p 
     where p.UserTypeB = :id 
     and (
       select top 1 r.boolean 
       from AcmeDemoBundle:Registry r 
      ) 
     = true"; 

但似乎TOP 1这不是在doctrine2有效的功能。

我想不出如何限制子查询的结果为一行。

+0

类似的问题http://stackoverflow.com/questions/14234233/doctrine-2-limit-in-subquery 但没有答案,以及:( – 2013-02-13 17:54:55

+0

这里http://stackoverflow.com/questions/24068947/ subquery-with-limit-in-doctrine可能是一个解决方案 – 2016-11-07 16:19:55

回答

2

DQL不支持子查询限制,也不支持LIMIT也不支持OFFSET

http://www.doctrine-project.org/jira/browse/DDC-885

+1

我知道,我知道,我正在寻找任何替代代码。不知道是否可以使用createQuery。 – 2013-02-14 08:43:32

+0

通过NativeSQL(http:// docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/native-sql.html) – Ocramius 2013-02-14 09:02:54

1

虽然学说本身并不支持这一点,你可以实现一个名为FIRST()实现这个自定义函数:

<?php 

use Doctrine\ORM\Query\AST\Functions\FunctionNode; 
use Doctrine\ORM\Query\AST\Subselect; 
use Doctrine\ORM\Query\Lexer; 
use Doctrine\ORM\Query\Parser; 
use Doctrine\ORM\Query\SqlWalker; 

/** 
* FirstFunction ::= 
*  "FIRST" "(" Subselect ")" 
*/ 
class FirstFunction extends FunctionNode 
{ 
    /** 
    * @var Subselect 
    */ 
    private $subselect; 

    /** 
    * {@inheritdoc} 
    */ 
    public function parse(Parser $parser) 
    { 
     $parser->match(Lexer::T_IDENTIFIER); 
     $parser->match(Lexer::T_OPEN_PARENTHESIS); 
     $this->subselect = $parser->Subselect(); 
     $parser->match(Lexer::T_CLOSE_PARENTHESIS); 
    } 

    /** 
    * {@inheritdoc} 
    */ 
    public function getSql(SqlWalker $sqlWalker) 
    { 
     return '(' . $this->subselect->dispatch($sqlWalker) . ' LIMIT 1)'; 
    } 
} 

(更多细节:https://www.colinodell.com/blog/201703/limiting-subqueries-doctrine-2-dql

你应该因为Doctrine不会在结果中包含其他相关实体(如果您保存它可能会成为孤立或丢失),因此仅将其用于只读目的。

+0

这是唯一实际工作的人。 – 2017-10-10 10:04:49