2012-11-07 18 views
13

tôi nhận được một lỗi lạ khi tôi thực hiện truy vấn DQL này:Sử dụng một hàm DATE() trong một mệnh đề WHERE với DQL

SELECT u FROM User u LEFT JOIN u.schedule s WHERE DATE(s.timestamp) = DATE(NOW()) 

Trường hợp ngoại lệ được ném bởi Học thuyết với thông điệp:

Expected known function, got 'DATE' 

vấn đề trông giống như this bug, nhưng đó đề cập đến DATE() chức năng trong một mệnh đề GROUP BY và các lỗi được đóng cửa cho học thuyết 2.2. Tại thời điểm này, tôi nhận được ngoại lệ với học thuyết 2.4-DEV.

Truy vấn có nghĩa là để chọn tất cả người dùng lên kế hoạch cho ngày hôm nay. Có cách nào tôi có thể tạo DQL này? Tôi đã thử nghiệm phiên bản SQL trong phpMyAdmin và có truy vấn không gây ra lỗi. Điều gì có thể sai?

+1

Doctrine2 DQL không có hàm DATE() hoặc NOW(): http://doctrine-orm.readthedocs.org/en/latest/reference/dql-doctrine-query-language.html#dql-functions . Nhưng bạn có thực sự muốn so sánh hai dấu thời gian trên sự bình đẳng của họ không? – memoryleak

+0

Tôi đã lên kế hoạch cho các bệnh nhân hẹn (ngày + giờ) và tôi muốn liệt kê tất cả bệnh nhân cho ngày hôm nay. Có một cách xấu xí để làm điều này: chuẩn bị câu lệnh với một đối tượng 'DateTime' php cho" today ". Và chia trường datetime thành phần "ngày" và "thời gian". Tôi có thể vượt qua phần xấu xí đầu tiên, nhưng thứ hai chỉ là vặn với db của bạn bởi vì một vấn đề lớp trừu tượng. Vì vậy, đó là lý do tại sao tôi hy vọng cho một giải pháp mà điều này sẽ làm việc :) Tôi đã thử một 'CHỌN CAST (s.timestamp như NGÀY) như schedule_day TỪ ... WHERE schedule_day =: today' nhưng nó trả lại một lỗi tương tự ... –

Trả lời

31

Bạn có thể đạt được những gì bạn muốn bằng cách sử dụng một custom function:

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

class DateFunction extends FunctionNode 
{ 
    private $arg; 

    public function getSql(SqlWalker $sqlWalker) 
    { 
     return sprintf('DATE(%s)', $this->arg->dispatch($sqlWalker)); 
    } 

    public function parse(Parser $parser) 
    { 
     $parser->match(Lexer::T_IDENTIFIER); 
     $parser->match(Lexer::T_OPEN_PARENTHESIS); 

     $this->arg = $parser->ArithmeticPrimary(); 

     $parser->match(Lexer::T_CLOSE_PARENTHESIS); 
    } 
} 

Sau đó đăng ký chức năng này trong mã của bạn:

$em->getConfiguration()->addCustomDatetimeFunction('DATE', 'DateFunction'); 

Và truy vấn DQL bạn sẽ làm việc!

+0

sẽ cố gắng, cảm ơn! Điều này có thể giúp tôi tiết kiệm rất nhiều đau đầu, nơi tôi đã chia dấu thời gian theo lịch trình trong một ngày và thời gian riêng biệt một phần –

+0

Nó làm việc cho tôi! T4All! –

+7

Dưới đây là làm thế nào để đăng ký chức năng DQL mới trong một ứng dụng Symfony2: http://symfony.com/doc/current/cookbook/doctrine/custom_dql_functions.html – Quentin