UNIX_TIMESTAMP、ROUND、およびSymfony 2のqueryBuilderを介した他のDQLクエリ

ご存じのように、Doctrine 2のSymfony 2はそのままで、 UNIX_TIMESTAMPROUNDなどいくつかの標準Mysql関数をサポートしていません。 まず、関数でDQLを補完する方法を理解するための記事。 しかし、それを書く前に、「bother」と「github」が必要です。突然誰かがすでに書いているので、自転車を作らず、 GitHub MysqlDoctrineFunctionsなどの既製のツールを使用しないことをお勧めします。



この記事は初心者に適しています。



だから、タスク! ROUND関数を作成するには、続行します。



最初に必要なことは、 Doctrine \ ORM \ Query \ AST \ Functions \ FunctionNodeからFunctionNodeを介してメソッドの説明を作成することです。

バンドルに DQLというフォルダーを作成します(もちろん、好きな名前を付けることができます)

私にはこのように見えます: src / Acme / SimpleBundle / DQL



Round.phpなどの名前でこのディレクトリにファイルを作成すると、 src / Acme / SimpleBundle / DQL / Round.phpになります

内容:

namespace Acme\SimpleBundle\DQL; use Doctrine\ORM\Query\Lexer; use Doctrine\ORM\Query\AST\Functions\FunctionNode; class Round extends FunctionNode { protected $roundExp; protected $roundPrecission; public function getSql(\Doctrine\ORM\Query\SqlWalker $sqlWalker) { return 'ROUND(' . $sqlWalker->walkArithmeticExpression($this->roundExp) . ','. $sqlWalker->walkArithmeticExpression($this->roundPrecission) .')'; } /** * parse - allows DQL to breakdown the DQL string into a processable structure * @param \Doctrine\ORM\Query\Parser $parser */ public function parse(\Doctrine\ORM\Query\Parser $parser) { $parser->match(Lexer::T_IDENTIFIER); $parser->match(Lexer::T_OPEN_PARENTHESIS); $this->roundExp = $parser->ArithmeticExpression(); //     $parser->match(Lexer::T_COMMA); //   $this->roundPrecission = $parser->ArithmeticExpression(); //     $parser->match(Lexer::T_CLOSE_PARENTHESIS); } }
      
      







名前が示すとおり、 getSql関数は、準備されたSQLをORMに返す2つの関数を実装する必要があります。parse 、クエリに渡された変数、たとえばround(sum、2)を解析するためのものです。



関数にパラメーターを渡すには、内部変数を定義する必要があります。この例では次のとおりです。



  protected $roundExp; protected $roundPrecission; //        round(roundExp, roundPrecission)
      
      







次に、関数を探す場所を教義に伝える必要があります。これは、 教義セクションのconfig.ymlで指定します。標準のDQLに追加があることを示しています。



 doctrine: dbal: driver: %database_driver% host: %database_host% port: %database_port% dbname: %database_name% user: %database_user% password: %database_password% charset: UTF8 orm: auto_generate_proxy_classes: %kernel.debug% auto_mapping: true dql: string_functions: unix_timestamp: \Acme\SimpleBundle\DQL\UnixTimestamp numeric_functions: round: \Acme\SimpleBundle\DQL\Round
      
      







次に、フォームのクエリを実行するとき:

 $queryBuilder->andWhere("ROUND (sum) , 1) = :condition");
      
      





教義は関数に入り、Mysqlで正しいクエリを作成します。



NeonXPのリクエストにより、 unix_timestamp関数が追加れました

 namespace Acme\SimpleBundle\DQL; use Doctrine\ORM\Query\Lexer; use Doctrine\ORM\Query\AST\Functions\FunctionNode; class Round extends FunctionNode { protected $arithmeticExprt; public function getSql(\Doctrine\ORM\Query\SqlWalker $sqlWalker) { return 'UNIX_TIMESTAMP(' . $sqlWalker->walkArithmeticExpression($this->arithmeticExprt) .')'; } /** * parse - allows DQL to breakdown the DQL string into a processable structure * @param \Doctrine\ORM\Query\Parser $parser */ public function parse(\Doctrine\ORM\Query\Parser $parser) { $parser->match(Lexer::T_IDENTIFIER); $parser->match(Lexer::T_OPEN_PARENTHESIS); $this->arithmeticExprt = $parser->ArithmeticExpression(); //    $parser->match(Lexer::T_CLOSE_PARENTHESIS); } }
      
      






All Articles