2012-12-12 47 views
13

जैसे इकाई के लिए डिफ़ॉल्ट समय टिकट जोड़ें, सिद्धांत दिशानिर्देशों के बाद मैं समझता हूं कि एक इकाई के लिए डिफ़ॉल्ट मान कैसे सेट करें, लेकिन क्या होगा यदि मैं दिनांक/समय टिकट चाहता हूं?सिद्धांत - एनओयू()

मेरे समस्या मेरी डेटाबेस एक मैदान पर NOW() की एक डिफ़ॉल्ट है लेकिन जब मैं सिद्धांत का प्रयोग कर एक रिकॉर्ड सम्मिलित करने मूल्यों अशक्त या रिक्त हैं, लेकिन डालने के बाकी हुआ है ।

चूंकि सिद्धांत एक कॉन्स्ट के रूप में डिफ़ॉल्ट घोषित करने के लिए कहता है, यह भी एक समस्या पैदा करता है।

सुझाव?

उत्तर

21

ठीक है, मैं समाधान नहीं मिला:

prePersist विकल्प मैं क्या कर रहा है।

सुनिश्चित करें कि आप एनोटेशन

<?php 

/** @Entity 
* @HasLifecycleCallbacks 
*/ 
class User 

और यहाँ में परिभाषित बनाओ समारोह उदाहरण है वे

/** 
* @PrePersist 
*/ 
public function doStuffOnPrePersist() 
{ 
    $this->createdAt = date('Y-m-d H:i:s'); 
} 

की पेशकश और तुम ORM उपयोग कर रहे हैं जैसे मैं

<?php 

/** @ORM\Entity 
* @ORM\HasLifecycleCallbacks 
*/ 
class User 

हूँ और यहां फ़ंक्शन उदाहरण है जो वे

प्रदान करते हैं
/** 
* @ORM\PrePersist 
*/ 
public function doStuffOnPrePersist() 
{ 
    $this->createdAt = date('Y-m-d H:i:s'); 
} 
+2

* 'वाई-एम-डी एच: i: s' उचित दिनांक स्वरूप स्ट्रिंग – redolent

+0

धन्यवाद @redolent, निश्चित –

+0

क्या PHP एनोटेशन के घृणित उपयोग किए बिना इसे प्राप्त करने का कोई तरीका है? – Sejanus

0

PostgreSQL के लिए, आपको कार्य करने के लिए टाइमस्टैंप प्राप्त करने के लिए फ़ील्ड के लिए now के स्ट्रिंग मान को पारित करने में सक्षम होना चाहिए।

+0

धन्यवाद देखो, PostgreSQL 9.x का उपयोग करना है और जब अब से डिफ़ॉल्ट मान बदल रहा है() से CURRENT_TIMESTAMP तक, लेकिन यह अब वापस लौटता है()। एक टेस्ट टेबल भी बनाया और डेटाटाइम कॉलम को CURRENT_TIMESTAMP पर सेट किया लेकिन अब भी वापस लौटाया()। कोई अन्य विचार? –

+0

क्षमा करें, यह नहीं पता था कि यह पोस्टग्रेस था। मैं MySQL के लिए कमेंट्री दे रहा था जो आमतौर पर PHP उपयोगकर्ताओं द्वारा सामना किया जाता है। PostgreSQL के लिए टैग जोड़ा है। मैंने अपना जवाब भी अपडेट किया है। –

+0

खेद है कि काम नहीं करता है, स्ट्रिंग अब –

7

मेरे अनुभव में सब कुछ अपनी संस्थाओं में रखना सर्वोत्तम है और ओआरएम को बाईपास करने के लिए अपने डेटाबेस को मजबूर करने की कोशिश न करें।

<?php 
namespace Phill\PaffordBundle\Entity; 
use Doctrine\ORM\Mapping as ORM; 
/** 
* Stack 
* @ORM\Table() 
*/ 
class Stack 
{ 
    /** 
    * @var integer 
    * @ORM\Column(type="integer") 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    private $id; 

    /** 
    * @var \DateTime 
    * @ORM\Column(type="datetime") 
    */ 
    private $startDate; 

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

} 
+1

मैं असहमत हूं, यहां क्यों है: ओआरएम बदल सकता है, अगर मैं कच्चे एसक्यूएल करता हूं, तो अन्य कारण भी हैं लेकिन इसे कम से कम डेटा अखंडता –

+0

के लिए डेटाबेस पक्ष पर संभाला जाना चाहिए, फिर यह आपकी आवश्यकताओं पर निर्भर करता है। अक्सर डॉक्टरेट का उपयोग करते समय यह ओआरएम को प्रोग्राम करने का डेवलपर का इरादा है और डीबी को बैकएंड के रूप में उपयोग करें। यदि ऐसा नहीं है तो सामान को डीबी को पुशहेड करने की आवश्यकता होगी, जैसा कि आप सुझाव दे रहे हैं। मुझे लगता है कि उन लोगों के लिए जो ओआरएम के साथ केवल इंटरफेस की तलाश में हैं, यह बेहतर समाधान है। –

+0

मुझे लगता है कि यह ध्यान देने योग्य है कि इस समाधान और @ फिलफ़ाफ़र्ड दोनों के ऊपर अच्छे समाधान हैं। उस काम में एक महत्वपूर्ण भेद है। मेरे समाधान में टाइमस्टैम्प बनाया जाता है जब इकाई पहली बार तत्काल होती है। इस समाधान में टाइमस्टैम्प उस समय सेट होता है जब यह डेटाबेस पर जारी रहता है। –

4

आदेश में वास्तव में है करने के लिए NOW() आप Doctrine\DBAL\Types\DateTimeType का विस्तार कर सकते हैं।

अन्य विधि:

class DateTimeNow 
{ 
    public function format() 
    { 
     return 'NOW()'; 
    } 
} 

तो फिर तुम $entity->setFieldDatetime(DateTimeNow()) बजाय $entity->setFieldDatetime(new Datetime()) उपयोग कर सकते हैं।
नोट: विधि format() स्वचालित रूप से सिद्धांत द्वारा बुलाया जाता है।

+0

कहां (यानी किस फाइल में) यह कोड रखा जाना चाहिए (सिम्फनी में)? धन्यवाद! –

+0

@ थॉमस लैंडौयर मैंने इसे डर्टी किया और इसे सीधे उस फाइल में रखा जहां मुझे इसका उपयोग करने की ज़रूरत है ... लेकिन विक्रेता फ़ोल्डर में कुछ बंडल बनाना या ऐसा कुछ बेहतर होगा। – Alexandre

+0

यह उत्तर अब तक का एकमात्र समाधान है जो डेटाबेस सर्वर के समय (PHP के समय के बजाय) का उपयोग करता है। यहां यह एक अच्छी बात क्यों है: http://stackoverflow.com/a/3705090/1668200 –

1

इस प्रयास करें:

$value->format('Y-m-d H:i:s'); 

देखें relevant Doctrine code line

सिद्धांत के साथ काम करने परीक्षण किया गया:

/** 
* @var \DateTime 
* 
* @Column(name="created", type="datetime", nullable=false) 
*/ 
private $created; 

function __construct() 
{ 
    $this->created = new \DateTime(); 
} 

जो कुछ $value आप created क्षेत्र के लिए आवंटित, इस कॉल को संभालने में सक्षम हो गया है 2.5.4

नोट: ऊपर काम करता है निर्माण के समय में लेकिन डिफ़ॉल्ट रूप से अद्यतन पर नहीं - आप मैन्युअल रूप से new \DateTime() को created गुण सेट करने के लिए जब आप एक अद्यतन करते हैं या में doStuffOnPrePersist

/** @PrePersist */ 
public function doStuffOnPrePersist() 
{ 
    $this->created = date('Y-m-d H:i:s'); 
} 
+0

यह कैसे काम कर रहा है आप?मुझे त्रुटि मिलती है: त्रुटि: स्ट्रिंग पर किसी सदस्य फ़ंक्शन प्रारूप() पर कॉल करें जो समझ में आता है, क्योंकि 'CURRENT_TIMESTAMP' स्ट्रिंग है:/ –

+0

हा, मुझे एक ही त्रुटि मिलती है! (मैं केवल डेटा पढ़ने के लिए इसका उपयोग कर रहा हूं) – Dennis

+0

@ दारायस, अभी आज़माएं (अपडेट किया गया उत्तर देखें) – Dennis