2011-10-08 24 views

Trả lời

32

Bạn lập bản đồ tài sản của bạn như loại DateTime sau đó thiết lập các giá trị trong các nhà xây dựng sử dụng một đối tượng DateTime mới:

/** 
* @Entity 
* @Table(name="...") 
*/ 
class MyEntity 
{ 
    /** @Column(type="datetime") */ 
    protected $registration_date; 

    public function __construct() 
    { 
     $this->registration_date = new DateTime(); 
    } 
} 

này hoạt động như các nhà xây dựng của một lớp tiếp tục tồn tại không được kêu gọi hydrat hóa.

+0

Tôi bỏ phiếu cho câu trả lời này vì đó là giải pháp PHP thuần túy. Câu trả lời khác có thể: 1) cần kiến ​​thức đặc biệt 'onPrePersistSetRegistrationDate' thêm' HasLifecycleCallbacks', 'PrePersist' chú thích 2) Tôi muốn thiết lập một giá trị mặc định cần tôi thêm thư viện thứ 3' @Gedmo \ Timestampable'? !! 3) CURRENT_TIMESTAMP đôi khi không tốt. Ví dụ: khi máy chủ tập lệnh của bạn ở Trung Quốc nhưng máy chủ cơ sở dữ liệu ở Hoa Kỳ. (nguyên nhân, nó không phải là rất phổ biến, nhưng có những trường hợp như vậy) – Yarco

41

Bạn cũng có thể sử dụng callbacks vòng đời nếu bạn muốn trở thành rất chính xác:

use Doctrine\ORM\Mapping as ORM; 

/** 
* @ORM\HasLifecycleCallbacks 
* ... 
*/ 
class MyEntity 
{ 
    /** 
    * @ORM\PrePersist 
    */ 
    public function onPrePersistSetRegistrationDate() 
    { 
     $this->registration_date = new \DateTime(); 
    } 
} 
+2

Tôi thích câu trả lời này vì nó làm cho nó rõ ràng hơn như thế nào Doctrine sẽ xử lý nó. –

+1

+1 Nó sẽ đặt ngày mới nhất trong hồ sơ. Nếu bản ghi có hai ngày modified_datetime và created_datetime. Nếu bạn đặt modified_datetime trong hàm tạo, thì hàm created_time có thể mới hơn modified_datetime. –

+0

Để tham khảo về tất cả các khả năng của cuộc gọi lại vòng đời: http://doctrine-orm.readthedocs.org/en/latest/reference/events.html#reference-events-lifecycle-events – fyrye

17

Có một phần mở rộng cho tự động hoá này này ...

https://github.com/l3pp4rd/DoctrineExtensions/blob/master/doc/timestampable.md

/** 
    * @var \DateTime 
    * 
    * @ORM\Column(name="date_added", type="datetime") 
    * @Gedmo\Timestampable(on="create") 
    */ 
    private $date_added; 

    /** 
    * @var \DateTime 
    * 
    * @ORM\Column(name="date_modified", type="datetime") 
    * @Gedmo\Timestampable(on="update") 
    */ 
    private $date_modified; 
+2

Điều này cần nâng cấp vì nó chắc chắn là cách tốt nhất để làm điều này. – Sc0ttyD

+2

@ Sc0ttyD Tại sao nên sử dụng tiện ích mở rộng nếu bạn có thể đạt được cùng một mục tiêu với các tính năng cơ bản? – luba

+0

Không có ý tưởng - không sử dụng PHP nữa, đây là 3 năm trước :-) – Sc0ttyD

32

Đối với mặc định giá trị CURRENT_TIMESTAMP:

 @ORM\Column(name="created_at", type="datetime", options={"default": 0}) 
.210

Làm việc đối với tôi ...

+6

Đây phải là câu trả lời hàng đầu hiện nay IMO, đặc biệt nếu bạn muốn chính lược đồ bảng giả sử CURRENT_TIMESTAMP – skrilled

+1

Cảm ơn. Điều này đã giúp tôi rất nhiều. Tôi đã sử dụng 'options = {" default ":" CURRENT_TIMESTAMP "})' trước đó thường hoạt động tốt. Nhưng với db postgres của tôi đằng sau nó nó đã chuyển thành DEFAULT NOW() là cách postgres. Nhưng sau đó một học thuyết: di cư: diff sẽ hiểu sai() là một độ lệch từ CURRENT_TIMESTAMP và tạo một tệp khác mỗi khi tôi chạy nó. Nhưng với học thuyết giải pháp này, mọi thứ được đồng bộ. – luba

+1

Câu trả lời hay và IMO, cách sạch nhất để làm điều này. Nếu đó là bất kỳ sự quan tâm nào thì điều này đã được dịch là 'ADD date_added TIMESTAMP (0) KHÔNG CÓ MÃI THỜI GIAN DEFAULT CURRENT_TIMESTAMP NOT NULL' cho tôi. – crmpicco

16

Tôi nghĩ rằng, cách tốt nhất để thực hiện tự động điền cho datetime là làm như thế:

* @ORM\Column(type="datetime", options={"default"="CURRENT_TIMESTAMP"}) 

Đưa logic để xây dựng không phải là giải pháp đúng, bởi vì thiết lập mặc định các giá trị là Trách nhiệm của khách hàng SQL. Nếu bạn quyết định không sử dụng ORM nữa - bạn sẽ mất logic nghiệp vụ. Ngoài ra, nếu sử dụng hàm tạo, bạn sẽ không thể thêm dấu thời gian mặc định cho các thuộc tính datetime cho các hàng hiện tại.

+0

cảm ơn bạn: D Câu trả lời hay nhất – julestruong

+0

Điều này không hiệu quả trong học thuyết 2.5. – magnetik

+0

Như đã đề cập bên dưới '" mặc định ": 0' hoạt động tốt hơn với việc di chuyển học thuyết. – luba

Các vấn đề liên quan