2013-02-13 85 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