मैं लारावेल माइग्रेशन के साथ वर्तमान टाइमस्टैम्प में एक टाइमस्टैम्प कॉलम के डिफ़ॉल्ट मान को कैसे सेट कर सकता हूं?


167

मैं CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMPलारवेल स्कीमा बिल्डर / माइग्रेशन का उपयोग करने के डिफ़ॉल्ट मूल्य के साथ टाइमस्टैम्प कॉलम बनाना चाहूंगा । मैं कई बार लारवेल डॉक्यूमेंटेशन से गुजरा हूं, और मैं यह नहीं देखता कि मैं कैसे टाइमस्टैम्प कॉलम के लिए डिफ़ॉल्ट बना सकता हूं।

timestamps()समारोह चूक करता है 0000-00-00 00:00दोनों स्तंभ यह है कि बनाता है के लिए।

जवाबों:


310

यह देखते हुए कि यह एक कच्चे अभिव्यक्ति है, आप का उपयोग करना चाहिए DB::raw()सेट करने के लिए CURRENT_TIMESTAMPएक स्तंभ के लिए कोई डिफ़ॉल्ट मान के रूप में:

$table->timestamp('created_at')->default(DB::raw('CURRENT_TIMESTAMP'));

यह हर डेटाबेस ड्राइवर पर निर्दोष रूप से काम करता है।

नया शॉर्टकट

लारवेल 5.1.25 ( पीआर 10962 और 15c487fe देखें ) के रूप में आप एक कॉलम के लिए डिफ़ॉल्ट मान useCurrent()सेट करने के लिए नए कॉलम संशोधक विधि का उपयोग कर सकते हैं CURRENT_TIMESTAMP:

$table->timestamp('created_at')->useCurrent();

इस सवाल पर, MySQL पर आप ON UPDATEक्लॉज़ का उपयोग कर सकते हैं DB::raw():

$table->timestamp('updated_at')->default(DB::raw('CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP'));

gotchas

  • MySQL

    5.7 MySQL के साथ शुरू, 0000-00-00 00:00:00अब एक वैध तिथि माना जाता है। जैसा कि लारवेल 5.2 अपग्रेड गाइड में प्रलेखित किया गया है , जब आप अपने डेटाबेस में रिकॉर्ड डालते हैं , तो सभी टाइमस्टैम्प कॉलम को एक वैध डिफ़ॉल्ट मान प्राप्त करना चाहिए। आप useCurrent()अपने माइग्रेशन में कॉलम मॉडिफायर (लारवेल 5.1.25 और उससे ऊपर) का उपयोग करके टाइमस्टैम्प कॉलम को वर्तमान टाइमस्टैम्प में डिफ़ॉल्ट कर सकते हैं, या आप nullable()शून्य मानों को अनुमति देने के लिए टाइमस्टैम्प बना सकते हैं ।

  • PostgreSQL और Laravel 4.x

    Laravel 4.x संस्करणों में, PostgreSQL ड्राइवर टाइमस्टैम्प मूल्यों को संग्रहीत करने के लिए डिफ़ॉल्ट डेटाबेस परिशुद्धता का उपयोग कर रहा था। CURRENT_TIMESTAMPडिफ़ॉल्ट परिशुद्धता के साथ एक स्तंभ पर फ़ंक्शन का उपयोग करते समय , PostgreSQL उपलब्ध उच्च परिशुद्धता के साथ एक टाइमस्टैम्प बनाता है, इस प्रकार एक आंशिक दूसरे भाग के साथ टाइमस्टैम्प पैदा करता है - यह SQL फ़िडल देखें

    इससे कार्बन एक टाइमस्टैम्प को पार्स करने में विफल हो जाएगा क्योंकि यह उम्मीद नहीं करेगा कि माइक्रोसेकंड संग्रहीत किया जा रहा है। इस अनपेक्षित व्यवहार से बचने के लिए आपको अपने एप्लिकेशन को तोड़ने के लिए CURRENT_TIMESTAMPनीचे दिए गए फ़ंक्शन को स्पष्ट रूप से शून्य परिशुद्धता देना होगा :

    $table->timestamp('created_at')->default(DB::raw('CURRENT_TIMESTAMP(0)'));

    लारवेल 5.0 के बाद से, timestamp()कॉलम को शून्य की एक डिफ़ॉल्ट परिशुद्धता का उपयोग करने के लिए बदल दिया गया है जो इससे बचता है।

    इस मुद्दे को टिप्पणियों में इंगित करने के लिए @andrewhl का धन्यवाद ।


रास्ता बेहतर सुझाव तो मेरा। मेरे DB::statementउदाहरण के बजाय इसका उपयोग करें , यह बहुत सरल है।
10

क्या यह आपके परीक्षणों में बयानों द्वारा पार्टी के लिए भी इस्तेमाल किया जा सकता है?
ग्लेन प्लास

2
निर्दोष नहीं है। PostgreSQL के लिए 'CURRENT_TIMESTAMP' के प्रारूप में कुछ रिटर्न: 2014-08-11 15: 06: 29.692439। इसके कारण कार्बन :: createFromFormat ('Ymd H: i: s', $ टाइमस्टैम्प) विधि विफल हो जाती है (यह अनुगामी मिलीसेकंड को पार्स नहीं कर सकती)। यह टाइमस्टैम्प का उपयोग करते समय लारवेल द्वारा उपयोग किया जाता है। PostgreSQL के लिए ठीक करने के लिए: DB :: raw ('अब () :: टाइमस्टैम्प (0)') (संदर्भ: postgresql.org/docs/8.1/static/… )
andrewhl

@andrewhl दरअसल मैंने MySQL के लिए ही उत्तर दिया था, क्योंकि यह प्रश्न विषय है। लेकिन हमारे साथ इसे साझा करने के लिए धन्यवाद, मैं अपने उत्तर को कवर करने के लिए अपडेट करूंगा! :)
पाउलो फ्रीटस

55

स्तंभ created_atऔर updated_atस्तंभ दोनों बनाने के लिए :

$t->timestamp('created_at')->default(DB::raw('CURRENT_TIMESTAMP'));
$t->timestamp('updated_at')->default(DB::raw('CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP'));

आपको कई कॉलम के साथ MySQL संस्करण> = 5.6.5 की आवश्यकता होगी CURRENT_TIMESTAMP


3
सिर्फ उपयोग क्यों नहीं $table->timestamps()->default(DB::raw('CURRENT_TIMESTAMP'));?
डेव

1
@dave क्योंकि तब updated_atपरिवर्तन नहीं होगा जब रिकॉर्ड को इसके प्रारंभिक निर्माण के बाद संशोधित किया गया था
एरिक बर्कुन-ड्रेविनीग

हाँ, उस टाइमस्टैम्प में जोड़ें () वैसे भी डिफॉल्ट के लिए अनुमति नहीं देता है, इसलिए यह बिल्कुल भी काम नहीं करेगा। मैंने इसे अनुमति देने के लिए कोड प्रतिबद्ध किया था, लेकिन लारवेल प्रबंधक वास्तव में डिफ़ॉल्ट रूप से उपयोग करने वाले लोगों को नहीं चाहते हैं जो हम इसका उपयोग कर रहे हैं (यह मानते हुए कि MySQL के संस्करण 5.6.5 से पहले कई कॉलमों को डिफ़ॉल्ट रूप से टाइमस्टैम्प की अनुमति नहीं देते हैं)।
डेव

दरअसल अपडेटेड_एट को एलोकेंट द्वारा प्रबंधित किया जाता है, इसलिए किसी मॉडल को स्वचालित रूप से अपडेट किए जाने के बाद इसे "ऑन अपडेट" बिट की आवश्यकता नहीं है।
dmyers

@ खरीदार यदि आप वाक्पटु का उपयोग कर रहे हैं तो आप बस कर सकते हैं $t->timestamps();लेकिन यह प्रश्न का उत्तर नहीं देता है।
ब्रायन एडम्स

44

लारवेल 5.1.26 से शुरू, 2015-12-02 को टैग useCurrent()किया गया , एक संशोधक जोड़ा गया है:

Schema::table('users', function ($table) {
    $table->timestamp('created')->useCurrent();
});

पीआर 10962 (इसके बाद 15c487fe प्रतिबद्ध ) इसके अलावा आगे बढ़ा

आप ३६०२ और ११५१ 360 मुद्दों को भी पढ़ना चाह सकते हैं जो ब्याज के हैं।

मूल रूप से, MySQL 5.7 (डिफ़ॉल्ट कॉन्फिग के साथ) आपको समय क्षेत्र के लिए डिफ़ॉल्ट मान या अशक्त को परिभाषित करने की आवश्यकता होती है।


10

यह एक तथ्य के लिए काम नहीं करता है:

$table->timestamp('created_at')->default('CURRENT_TIMESTAMP');

यह 'डिफ़ॉल्ट 0' को नहीं हटाता है जो टाइमस्टैम्प के चयन के साथ आता है और यह सिर्फ कस्टम डिफ़ॉल्ट को जोड़ता है। लेकिन हमें उद्धरण के बिना इसकी आवश्यकता है। नहीं है कि सब कुछ है कि एक DB हेरफेर Laravel4 से आ रहा है। यही उसकी बात है। वह कुछ स्तंभों पर कस्टम डिफॉल्ट चाहता है जैसे:

$table->timestamps()->default('CURRENT_TIMESTAMP');

मुझे नहीं लगता कि लारवेल के साथ यह संभव है। मैं अब एक घंटे के लिए देख रहा हूं कि क्या यह संभव है।


अपडेट: पॉलोस फ्रीटा का जवाब दर्शाता है कि यह संभव है, लेकिन वाक्य रचना सीधी नहीं है।


महान। सही सामान। अंगूठे, इससे मुझे भी मदद मिली।
ग्लेन प्लास

छोटी टिप्पणी, चिल्लाने से पहले: यह मेरे लिए लार्वा में काम नहीं करता है, एक नज़र डालें जिस तारीख को यह उत्तर लिखा गया था: 2013। यह तब तक मान्य था। इससे पहले कि आप नीचे तीर टैप करें, मैं इसकी सराहना करूंगा।
ग्लेन प्लास

9

भविष्य के googlers के लिए अतिरिक्त संभावना के रूप में

मुझे लगता है कि रिकॉर्ड किए जाने पर अद्यतन किए गए कॉलम में null होना अधिक उपयोगी है, लेकिन कभी भी संशोधित नहीं किया गया है । यह db आकार (ठीक है, बस थोड़ा) को कम करता है और इसे पहली नजर में देखने के लिए संभव है कि डेटा को कभी भी संशोधित नहीं किया गया है।

इस के रूप में मैं का उपयोग करें:

$table->timestamp('created_at')->useCurrent();
$table->timestamp('updated_at')->default(DB::raw('NULL ON UPDATE CURRENT_TIMESTAMP'))->nullable();

(लारवेल 7 में mysql 8 के साथ)।


7

इसके बजाय पाउलो फ्रीटास सुझाव का उपयोग करें ।


जब तक लारवेल इसे ठीक करता है, तब तक चलाए जाने के बाद आप एक मानक डेटाबेस क्वेरी Schema::createचला सकते हैं।

    Schema::create("users", function($table){
        $table->increments('id');
        $table->string('email', 255);
        $table->string('given_name', 100);
        $table->string('family_name', 100);
        $table->timestamp('joined');
        $table->enum('gender', ['male', 'female', 'unisex'])->default('unisex');
        $table->string('timezone', 30)->default('UTC');
        $table->text('about');
    });
    DB::statement("ALTER TABLE ".DB::getTablePrefix()."users CHANGE joined joined TIMESTAMP DEFAULT CURRENT_TIMESTAMP NOT NULL");

इसने मेरे लिए अद्भुत काम किया।


यह एक अच्छी चाल है। मेरी इच्छा है कि स्कीमा बिल्डर समर्थित विभाजन तालिकाएँ जैसे मैं उन सभी स्थानों पर उपयोग करता हूँ। मैंने कोड में खुदाई करने की कोशिश की, लेकिन यह मेरे लिए स्पष्ट नहीं है कि मुझे यह कहां करना है।
ग्लेन प्लास

-2

यह आप इसे कैसे करते हैं, मैंने इसकी जाँच की है और यह मेरे लारवेल 4.2 पर काम करता है।

$table->timestamp('created_at')->default(DB::raw('CURRENT_TIMESTAMP'));

उम्मीद है की यह मदद करेगा।


-4

लारवेल 5 में बस:

$table->timestamps(); //Adds created_at and updated_at columns.

प्रलेखन: http://laravel.com/docs/5.1/migrations#creating-columns


12
लेकिन यह डिफ़ॉल्ट को CURRENT_TIMESTAMP के रूप में सेट नहीं करता है जैसा कि प्रश्न में पूछा गया है।
जोश

मैं इस में कोशिश करते हैं, लेकिन 5.4 आईडी में शून्य दिया क्यों, लेकिन जब मैं कोशिश -> useCurrent (); इसका काम ठीक है
एंथनी काल

का सवाल नहीं जवाब देता करता है CURRENT_TIMESTAMPपर created_atस्तंभ और on UPDATE CURRENT_TIMESTAMPपर updated_atस्तंभ। लारवेल के लोग इसे ठीक करते हैं, इसका उपयोग करें: $table->timestamp('created_at')->default(DB::raw('CURRENT_TIMESTAMP')); $table->timestamp('updated_at')->default(DB::raw('CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP'));
हमजा राशिद
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.