2013-03-25 2 views
2

Вопрос: Я хочу, чтобы выполнить запрос с QueryBuilder в Doctrine2 как: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 работа. Доктрина все еще добавляет цитаты вокруг функции inet_aton.

+0

Помогает ли это -> https://groups.google.com/forum/?fromgroups=#!topic/doctrine-user/gdCG5MoByD4 – Crisp

+0

Возможный дубликат http://stackoverflow.com/questions/15623257/doctrine- 2-DQL-MySQL-эквивалентно-к-раунд – Ocramius

ответ

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) . ')'; 
    } 
} 

После этого добавьте функцию в Doctrine 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); 
    } 
} 

Вы можете зарегистрировать его в конфигурации во время самонастройки ОРМ:

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

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

Просто ответ на обновление: (для новой версии SF)

После создать функцию DQL (см старшего поста),

Мы хотим зарегистрировать нам настроить класс DQL в YAML (config.yml), как, что:

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 

Об этом было сообщено here об официальной документации по Symfony.

Смежные вопросы