UNIX_TIMESTAMP, ROUND рдФрд░ рдЕрдиреНрдп DQL рдХреНрд╡реЗрд░реАрдЬрд╝ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ Symfony 2 рдореЗрдВ

рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдЬрд╛рдирддреЗ рд╣реИрдВ, рд╕рд┐рдореНрдлрдиреА 2 рдореЗрдВ рдбреЙрдХреНрдЯреНрд░рд┐рди 2 рдЖрдЙрдЯ рдСрдл рдж рдмреЙрдХреНрд╕ рдореЗрдВ рдХреБрдЫ рдорд╛рдирдХ рдореИрд╕рдХрд▓ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдЬреИрд╕реЗ UNIX_TIMESTAMP рдпрд╛ ROUND рдФрд░ рдХрдИ рдЕрдиреНрдпред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдпрд╣ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдЖрдкрдХреЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд╕рд╛рде DQL рдХреЛ рдХреИрд╕реЗ рдкреВрд░рдХ рдХрд┐рдпрд╛ рдЬрд╛рдП, рдПрдХ рд▓реЗрдЦред рд▓реЗрдХрд┐рди рдЗрд╕реЗ рд▓рд┐рдЦрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рдпрд╣ рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдХрд┐ "рдкрд░реЗрд╢рд╛рди рдХрд░реЗрдВ" рдФрд░ "рдЬреАрдереВрдм", рдФрд░ рдЕрдЪрд╛рдирдХ рдХрд┐рд╕реА рдиреЗ рдкрд╣рд▓реЗ рд╣реА рд▓рд┐рдЦрд╛ рд╣реИ, рдореИрдВ рдЖрдкрдХреЛ рд╕рд▓рд╛рд╣ рджреЗрддрд╛ рд╣реВрдВ рдХрд┐ рд╕рд╛рдЗрдХрд┐рд▓ рдмрдирд╛рдиреЗ рдФрд░ рддреИрдпрд╛рд░ рдЙрдкрдХрд░рдгреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рди рдХрд░реЗрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдЧрд┐рдЯрд╣рдм рдореИрд╕рдХрдХреНрд▓реЛрдлреНрд░реИрд╢рдирдлреИрдХреНрд╢рди ред

рдпрд╣ рд▓реЗрдЦ рд╢реБрд░реБрдЖрддреА рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХ рдЙрдкрдпреБрдХреНрдд рд╣реИред

рддреЛ, рдХрд╛рд░реНрдп! 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 рдлрд╝рдВрдХреНрд╢рди, рдУрдЖрд░рдПрдо рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рдПрд╕рдХреНрдпреВрдПрд▓ рд▓реМрдЯрд╛рдПрдЧрд╛, рдФрд░ рдкрд╛рд░реНрд╕ рдХреНрд╡реЗрд░реА рдХреЗ рд▓рд┐рдП рдкрд╛рд░рд┐рдд рдХрд┐рдП рдЧрдП рдЪрд░ рдХреЗ рд▓рд┐рдП рдЕрднрд┐рдкреНрд░реЗрдд рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рд░рд╛рдЙрдВрдб (рдпреЛрдЧ, 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"); 

рд╕рд┐рджреНрдзрд╛рдВрдд рд╣рдорд╛рд░реЗ рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ рдЬрд╛рдПрдЧрд╛ рдФрд░ рдореИрд╕реВрд░ рдореЗрдВ рд╕рд╣реА рдХреНрд╡реЗрд░реА рдХрд░реЗрдЧрд╛ред

рдирд┐рдпреЙрдирдПрдХреНрд╕рдкреА рдХреЗ рдЕрдиреБрд░реЛрдз рдкрд░, 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); } } 

Source: https://habr.com/ru/post/In209870/


All Articles