Một chút cách tiếp cận sạch sẽ sử dụng hơi đã sửa đổi mã @Ocramius.
Đặt đoạn mã này trong: src/YourNamespace/YourMainBundle/DoctrineFunctions/
thư mục như Round.php
filename:
<?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) . ')';
}
}
Sau đó đặt điều này trong app/config/config.yml
của bạn:
doctrine:
dql:
numeric_functions:
round: YourApp\YourMainBundle\DoctrineFunctions\Round
Điều đó sẽ cho phép bạn sử dụng ROUND()
chức năng trực tiếp trong các truy vấn DQL SELECT của bạn; không có vấn đề gì nếu được thực hiện với QueryBuilder hoặc trực tiếp qua createQuery()
Có điều này có vẻ như cách duy nhất để làm điều đó. Tôi đánh giá cao các hướng dẫn. – Shawn