sql >> データベース >  >> RDS >> Mysql

DoctrineでLIMITを使用したサブクエリ

    Doctrineに独自の構文を簡単に追加して、たとえばLIMIT 1を追加できます。 Colin O'Dellがブログで説明したように、サブクエリに/ a> 。

    // AppBundle\DBAL\FirstFunction
    <?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)';
        }
    }
    
    # app/config/config.yml
    doctrine:
        # ...
        orm:
            # ...
            dql:
                string_functions:
                    FIRST: AppBundle\DBAL\FirstFunction
    

    次のように使用します:

    $dqb->from('MyAppBundle:Foo', 'foo')
        ->leftJoin('foo.bar', 'bar', 'WITH', 'bar = FIRST(SELECT b FROM MyAppBundle:Bar b WHERE b.foo = foo AND b.published_date >= :now ORDER BY t.startDate)');
    


    1. 2つの日付範囲の間の等しい日数SQL

    2. ORACLEでVARCHARのXMLTYPEを変換するにはどうすればよいですか?

    3. MySQLトリガーの使用

    4. sys.dm_os_host_info動的管理ビューを使用してSQLServerでオペレーティングシステムのバージョン情報を返す