2012-12-16 21 views

Trả lời

35

Trong Doctrine2, bạn phải sử dụng một trong các tùy chọn sau thay vì NOW().
này:

CURRENT_TIMESTAMP() 

Hoặc:

... 
createQuery(...'WHERE x.date = :now') 
->setParameter('now', new \DateTime('now')) 
... 

Nếu bạn muốn chỉ có thời gian hoặc sử dụng ngày chỉ là một trong những: CURRENT_TIME()CURRENT_DATE()

Documentation can be found here.

+0

báo cáo liên kết Tài liệu, vui lòng cập nhật. – wesamly

+0

Điều CURRENT_TIMESTAMP() này chưa bao giờ làm việc cho tôi. Bạn có thể cung cấp một ví dụ về cách được sử dụng? Tôi không muốn sử dụng thời gian của máy chủ web thay vì cơ sở dữ liệu. Tôi luôn luôn kết thúc viết SQL thô (vẫn còn ràng buộc params) và gửi cho người xây dựng truy vấn. – ficuscr

+3

Cũng lưu ý ''now'' là tham số mặc định cho' DateTime', vì vậy 'new \ DateTime()' là đủ. –

7

Sử dụng xây dựng truy vấn nó sẽ trông như thế này:

$qb 
    ->select('B') 
    ->from('RandomBundle:Banana', 'B') 
    ->where(
     $qb->expr()->gt('B.expiresAt', ':now') 
    ) 
    ->setParameter('now', '\'CURRENT_TIMESTAMP()\''); 

Lưu ý: báo giá thêm về thông số thiết lập là cần để có được CURRENT_TIMESTAMP() chức năng làm việc.

Hoặc đơn giản là không tìm thấy

$qb 
    ->select('B') 
    ->from('RandomBundle:Banana', 'B') 
    ->where(
     $qb->expr()->gt('B.expiresAt', 'CURRENT_TIMESTAMP()') 
    ); 
+0

Trong ví dụ thứ hai, bạn có thể sử dụng ngắn hơn 'B.expiresAt> CURRENT_TIMESTAMP()' so sánh trực tiếp bên trong cuộc gọi 'where' thay vì sử dụng biểu thức trình tạo truy vấn – Clamburger

+0

Tôi giả sử nó được sử dụng thời gian của cơ sở dữ liệu. của máy chủ. Các tùy chọn thay thế là sử dụng một [trình tìm kiếm kết quả/truy vấn gốc] (http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/native-sql.html), hoặc để mở rộng Doctrine và viết Doctrine \ ORM \ Query \ AST \ Functions của riêng bạn. – ficuscr