2013-03-25 18 views

cevap

6

Bunun için bir custom DQL function uygulamalısınız.

DoctrineExtensions'da bazı örnekler vardır.

Aşağıdaki gibi bunu uygulayabilirsiniz:

<?php 

namespace MyApp\DQL; 

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

class Round extends FunctionNode 
{ 
    private $arithmeticExpression; 

    public function getSql(SqlWalker $sqlWalker) 
    { 

     return 'ROUND(' . $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); 
    } 
} 

Daha sonra yapılandırmada tescil edebilir ORM işe koşulması ise: Biraz daha temiz bir yaklaşım hafifçe kullanarak olurdu

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

$config->addCustomNumericFunction('ROUND', 'MyApp\DQL\Round'); 
+0

Evet bunu yapmak için tek yol gibi görünüyor. Yol tariflerini takdir ediyorum. – Shawn

6

modifiye @Ocramius kodu.

içinde bu kod parçası koyun:

<?php 
namespace YourApp\YourMainBundle\DoctrineFunctions; 

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

class Round extends FunctionNode 
{ 
    private $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); 
    } 

    public function getSql(\Doctrine\ORM\Query\SqlWalker $sqlWalker) 
    { 
     return 'ROUND(' . $sqlWalker->walkSimpleArithmeticExpression($this->arithmeticExpression) . ')'; 
    } 
} 

Sonra app/config/config.yml bu koymak: Round.php dosya adı olarak src/YourNamespace/YourMainBundle/DoctrineFunctions/ dizinde size doğrudan ROUND() fonksiyonunu kullanmasına izin vereceğini

doctrine: 
    dql: 
     numeric_functions: 
      round: YourApp\YourMainBundle\DoctrineFunctions\Round 

DQL SELECT sorgularınız; QueryBuilder ile veya doğrudan createQuery()

+2

İpucu için çok fazla ama "dql" yapılandırması "orm" altında olmalıdır (doctrine: orm: dql: ...). – ownking

3

ile yapılır. Yuvarlama kesinliğini belirtmek isterseniz, here verilen sınıfı kullanabilirsiniz. Symfony kullanıyorsanız, ekstra standart mysql işlevlerine sahip olacağınız için paketi de yükleyin.

bağlantılı kaynağın kod aşağıda da mevcuttur:

<?php 
namespace Mapado\MysqlDoctrineFunctions\DQL; 
use \Doctrine\ORM\Query\AST\Functions\FunctionNode; 
use \Doctrine\ORM\Query\Lexer; 
/** 
* MysqlRound 
* 
* @uses FunctionNode 
* @author Julien DENIAU <[email protected]> 
*/ 
class MysqlRound extends FunctionNode 
{ 
    /** 
    * simpleArithmeticExpression 
    * 
    * @var mixed 
    * @access public 
    */ 
    public $simpleArithmeticExpression; 
    /** 
    * roundPrecission 
    * 
    * @var mixed 
    * @access public 
    */ 
    public $roundPrecission; 
    /** 
    * getSql 
    * 
    * @param \Doctrine\ORM\Query\SqlWalker $sqlWalker 
    * @access public 
    * @return string 
    */ 
    public function getSql(\Doctrine\ORM\Query\SqlWalker $sqlWalker) 
    { 
     return 'ROUND(' . 
       $sqlWalker->walkSimpleArithmeticExpression($this->simpleArithmeticExpression) .','. 
       $sqlWalker->walkStringPrimary($this->roundPrecission) . 
     ')'; 
    } 
    /** 
    * 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->simpleArithmeticExpression = $parser->SimpleArithmeticExpression(); 
     $parser->match(Lexer::T_COMMA); 
     $this->roundPrecission = $parser->ArithmeticExpression(); 
     if ($this->roundPrecission == null) { 
      $this->roundPrecission = 0; 
     } 
     $parser->match(Lexer::T_CLOSE_PARENTHESIS); 
    } 
} 
İlgili konular