2013-03-25 24 views
2

問:我想在Doctrine2運行與QueryBuilder的查詢,如:INET_ATON在聲明中doctrine2的QueryBuilder zend2

SELECT * FROM TABLE WHERE `column1` = 'x' and (`column2` = INET_ATON('1.1.1.1') OR `column3` like '%bla%'...) 

我應該怎麼做這Doctrine2與Zend2?

我嘗試這樣做:

$where->add($qb->expr()->eq('column2', $qb->expr()->literal('inet_aton('1.1.1.1')))); 

但是doen't工作。 Doctrine還在inet_aton函數中添加了引號。

+0

這是否有幫助 - > https://groups.google.com/forum/?fromgroups=#!topic/doctrine-user/gdCG5MoByD4 – Crisp 2013-03-25 16:04:19

+0

可能的重複http://stackoverflow.com/questions/15623257/doctrine- 2- DQL MySQL的當量至圓 – Ocramius 2013-03-26 06:07:58

回答

3

好吧,我想通了自己:

你應該做的幾件事:

首先做一個DQL功能

<?php 

namespace Application\DQL; 

use Doctrine\ORM\Query\Lexer; 

class InetAtonFunction extends \Doctrine\ORM\Query\AST\Functions\FunctionNode 
{ 
    public $valueExpression = null; 

    /** 
    * parse 
    * 
    * @param \Doctrine\ORM\Query\Parser $parser 
    * @access public 
    * @return void 
    */ 
    public function parse(\Doctrine\ORM\Query\Parser $parser) 
    { 
     $parser->match(Lexer::T_IDENTIFIER); 
     $parser->match(Lexer::T_OPEN_PARENTHESIS); 
     $this->valueExpression = $parser->StringPrimary(); 
     $parser->match(Lexer::T_CLOSE_PARENTHESIS); 
    } 

    /** 
    * getSql 
    * 
    * @param \Doctrine\ORM\Query\SqlWalker $sqlWalker 
    * @access public 
    * @return string 
    */ 
    public function getSql(\Doctrine\ORM\Query\SqlWalker $sqlWalker) 
    { 
     return 'INET_ATON('. $this->valueExpression->dispatch($sqlWalker) . ')'; 
    } 
} 

後,該功能添加到學說ORM

<?php 
namespace Observer; 

//... 

class Module implements 
    AutoloaderProviderInterface, 
    ConfigProviderInterface, 
    ServiceProviderInterface 
{ 
//... 
    public function onBootstrap($e) 
    { 

     $application = $e->getParam('application'); 
     $sm = $application->getServiceManager(); 
     $em = $application->getEventManager(); 

     $entityManager = $sm->get('doctrine.entitymanager.orm_default'); 
     $entityManager->getConfiguration()->addCustomStringFunction('inet_aton', 'Application\DQL\InetAtonFunction');  
    } 
... 

在這之後你的好去。 現在你可以運行的QueryBuilder查詢,如

SELECT whatever FROM someting where cloumn = inet_aton(:?) 

我希望這可以幫助其他人在學說和Zend Framework2

1

這個問題似乎是Doctrine 2 DQL MySQL equivalent to ROUND()?

重複你需要實現一個custom DQL function

DoctrineExtensions中有一些示例。

您可以實現它像以下:

<?php 

namespace MyApp\DQL; 

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

class InetAnon extends FunctionNode 
{ 
    private $arithmeticExpression; 

    public function getSql(SqlWalker $sqlWalker) 
    { 

     return 'INET_ANON(' . $sqlWalker->walkSimpleArithmeticExpression(
      $this->arithmeticExpression 
     ) . ')'; 
    } 

    public function parse(\Doctrine\ORM\Query\Parser $parser) 
    { 

     $lexer = $parser->getLexer(); 

     $parser->match(Lexer::T_IDENTIFIER); 
     $parser->match(Lexer::T_OPEN_PARENTHESIS); 

     $this->arithmeticExpression = $parser->SimpleArithmeticExpression(); 

     $parser->match(Lexer::T_CLOSE_PARENTHESIS); 
    } 
} 

然後,您可以註冊它的配置,而自舉ORM:

$config = new \Doctrine\ORM\Configuration(); 

$config->addCustomNumericFunction('INET_ANON', 'MyApp\DQL\InetAnon'); 
1

只是一個答案的特殊功能進行更新:(對於新的SF版本)

後創建DQL功能(見較早的帖子),

我們要註冊我們定製的YAML(config.yml)這樣的DQL類:

doctrine: 
    dbal: 
     driver: "%database_driver%" 
     host:  "%database_host%" 
     port:  "%database_port%" 
     dbname: "%database_name%" 
     user:  "%database_user%" 
     password: "%database_password%" 

    orm: 
     auto_generate_proxy_classes: "%kernel.debug%" 
     auto_mapping: true 
     dql: 
      string_functions: 
       inet_aton: home\myBundle\myFolderContaintClass\InetAton 

這就是官方Symfony文檔中的here的解釋。

相關問題