Đây thực sự là một câu hỏi rất phổ biến. Nó chỉ ra rằng không phải tất cả các cơ sở dữ liệu sql đều hỗ trợ chức năng DATE, vì vậy những người tốt phụ trách Doctrine quyết định không hỗ trợ nó nativelly.
Loại điều ước mà họ đã làm bởi vì nó có thể tiết kiệm cho một nhóm người một lượng công sức.
Vì vậy, thêm lớp thay vì huyền diệu này để dự án của bạn:
namespace Cerad\Bundle\CoreBundle\Doctrine\DQL;
use Doctrine\ORM\Query\Lexer;
use Doctrine\ORM\Query\AST\Functions\FunctionNode;
class Date extends FunctionNode
{
public $date;
public function getSql(\Doctrine\ORM\Query\SqlWalker $sqlWalker)
{
return "DATE(" . $sqlWalker->walkArithmeticPrimary($this->date) . ")";
}
public function parse(\Doctrine\ORM\Query\Parser $parser)
{
$parser->match(Lexer::T_IDENTIFIER);
$parser->match(Lexer::T_OPEN_PARENTHESIS);
$this->date = $parser->ArithmeticPrimary();
$parser->match(Lexer::T_CLOSE_PARENTHESIS);
}
}
Sau đó dây nó lên trong phần thuyết của ứng dụng của bạn/config.yml:
doctrine:
orm:
default_entity_manager: default
auto_generate_proxy_classes: %kernel.debug%
entity_managers:
default:
connection: default
...
dql:
datetime_functions:
date: Cerad\Bundle\CoreBundle\Doctrine\DQL\Date
http://doctrine-orm.readthedocs.org/en/latest/cookbook/dql-user-defined-functions.html http://symfony.com/doc/current/cookbook/doctrine/custom_dql_functions.html http://symfony.com/doc/current/reference/configuration/doctrine.html
Có các gói khác ở đó với nhiều chức năng sql hơn. Kỳ lạ thay, lần đầu tiên tôi nhìn một vài năm trước đây, không ai trong số họ đã xác định ngày. Vì vậy, tôi chỉ làm của riêng tôi.
============================================== ======================
cập nhật 01
tôi đã không kiểm tra các thẻ một cách cẩn thận và cho rằng đây là một ứng dụng Symfony 2. Lớp Date vẫn giữ nguyên. Bạn dây nó lên bằng cách nhận được các đối tượng cấu hình giáo lý.
$config = new \Doctrine\ORM\Configuration();
$config->addCustomDatetimeFunction('DATE', 'blahblah\Date');
Kiểm tra liên kết Doctrine để biết chi tiết.
thể trùng lặp của [Học thuyết 2 - Lọc kết quả theo phần ngày một lĩnh vực datetime của] (http://stackoverflow.com/questions/10824383/doctrine-2 -filter-results-by-a-datetime-fields-date-part) – andy
@ không phải là bản sao. Tôi đang sử dụng ** queryBuilder ** và thông báo lỗi bằng cách sử dụng 'createQuery' và' queryBuilder' là giống nhau: 'Lỗi: Hàm đã biết dự kiến, có 'DATE''. – DanFromGermany
Các erro là như nhau vì không có 'DATE()' trong DQL. Nếu bạn sử dụng mệnh đề WHERE từ bản sao được liên kết, cách tiếp cận của bạn cũng sẽ hoạt động. – andy