2016-01-13 11 views
8

मैंने अभी Eloquent's (Laravel 5.2.10) डिफ़ॉल्ट टाइमस्टैम्प के साथ एक झगड़ा मारा। डिफ़ॉल्ट रूप से $table->timestamps() विधि आपको आपकी तालिका में created_at और updated_at कॉलम देता है जो तदनुसार अपडेट किया जाता है।Laravel Eloquent बनाया गया_at अपडेट हो रहा है

हालांकि, जब मैं कुछ परीक्षण प्रविष्टियों कोशिश कर रहा था, मैंने देखा है जब आप एक रिकॉर्ड को अपडेट, updated_at क्षेत्र एकदम सही ढंग से अद्यतन किया जाता है कि,, लेकिन created_at क्षेत्र भी अद्यतन हो जाता है: इसकी घंटे बनाई समय में रहता है , लेकिन updated_at फ़ील्ड से मेल खाने के लिए मिनट और सेकंड अपडेट हो जाते हैं।

+---------------------+---------------------+ 
| created_at   | updated_at   | 
+---------------------+---------------------+ 
| 2016-01-13 17:13:27 | 2016-01-13 22:13:27 | 
| 2016-01-13 16:14:41 | 2016-01-13 21:14:41 | 
+---------------------+---------------------+ 

सूचना है कि मिनट और सेकंड created_at और updated_at क्षेत्र के लिए ठीक उसी प्रकार हैं:

तो वह भी अधिक शब्दों था, यहाँ एक उदाहरण है।

मैंने Model कक्षा को देखने का प्रयास किया जहां टाइमस्टैम्प सेट हैं, लेकिन यह setCreatedAt() विधि को वास्तव में रिकॉर्ड अपडेट करते समय नहीं कहा जाता है।

क्यों ऐसा होता है?
कैसे क्या मैं created_at फ़ील्ड को बदलने से रोकता हूं? (अधिक महत्वपूर्ण)

उत्तर

5

आपका मुद्दा शायद इस मुद्दे को यहाँ से संबंधित है: https://github.com/laravel/framework/issues/11518

लंबी कहानी संक्षेप में, बहुत से लोगों के created_at स्तंभ ON UPDATE CURRENT_TIMESTAMP विशेषता थी।

Github पृष्ठ में बताया गया:

MySQL 5.7 नहीं रह गया है की अनुमति देता है 0000-00-00 के रूप में सख्त मोड के साथ एक मान्य टाइमस्टैम्प चालू (जो यह डिफ़ॉल्ट रूप से है)। तो या तो ->nullableTimestamps() या ->timestamp()->useCurrent() का उपयोग करें।

तो आप इस बदलकर इसे ठीक कर सकते हैं:

$table->timestamps(); 

करने के लिए या तो इनमें से एक विकल्प:

// Option 1: 
$table->nullableTimestamps(); 

// Option 2: 
$table->timestamp('updated_at')->useCurrent(); 
$table->timestamp('created_at')->useCurrent(); 

इसके अलावा, इस MySQL पृष्ठ पर: https://dev.mysql.com/doc/refman/5.6/en/timestamp-initialization.html

वैकल्पिक रूप से, यदि explicit_defaults_for_timestamp अक्षम है (डिफ़ॉल्ट), eithe करें निम्नलिखित में से:

एक डिफ़ॉल्ट डेटा के साथ कॉलम को परिभाषित करें जो निरंतर डिफ़ॉल्ट मान निर्दिष्ट करता है।

पूर्ण विशेषता निर्दिष्ट करें। यह कॉलम को नल मानों को अनुमति देने का भी कारण बनता है, जिसका अर्थ है कि आप कॉलम को न्यूल पर सेट करके वर्तमान टाइमस्टैम्प असाइन नहीं कर सकते हैं। NULL असाइन करना कॉलम को पूर्ण पर सेट करता है।

+0

मैंने एक 'संगीतकार अद्यतन' चलाया जो मुझे 5.2.10 तक लाया, लेकिन 'टाइमस्टैम्प()' विधि अभी भी ठीक से काम नहीं कर रही थी।हालांकि, 'nullableTimestamps() 'ठीक काम करता है इसलिए मैं इसका उपयोग अभी करूँगा (जिस मुद्दे पर आपने मुझे इंगित किया था यह इंगित करने के लिए कि यह डिफ़ॉल्ट' टाइमस्टैम्प() 'व्यवहार बन जाएगा, लेकिन अभी के लिए यह अभी भी काम नहीं करता है मेरे लिए। वैसे भी, धन्यवाद! – tam5

+1

@tam इसके बारे में क्षमा करें। 5 घंटे पहले (लैरवेल 5.2.9+) के रूप में, परिवर्तनों को वापस कर दिया गया है, इसलिए 'useCurrent() 'डिफ़ॉल्ट व्यवहार नहीं है। इससे लोगों के साथ कुछ समस्याएं हुईं जो MySQL के पुराने संस्करण का उपयोग कर रहे हैं। –

+0

कोई समस्या नहीं। वैकल्पिक और स्पष्टीकरण के लिए धन्यवाद – tam5

संबंधित मुद्दे