লারভেল মাইগ্রেশন সহ আমি কীভাবে টাইমস্ট্যাম্প কলামের ডিফল্ট মানকে বর্তমান টাইমস্ট্যাম্পে সেট করতে পারি?


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();

প্রশ্ন হলো, মাইএসকিউএল উপর আপনি ব্যবহার করতে পারে ফিরে যান ON UPDATEমাধ্যমে দফা DB::raw():

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

Gotchas

  • মাইএসকিউএল

    মাইএসকিউএল 5.7 দিয়ে শুরু করা, 0000-00-00 00:00:00আর একটি বৈধ তারিখ হিসাবে বিবেচিত হবে না। লারাভেল ৫.২ আপগ্রেড গাইডে নথিভুক্ত হিসাবে , আপনি যখন আপনার ডাটাবেসে রেকর্ড সন্নিবেশ করবেন তখন সমস্ত টাইমস্ট্যাম্প কলামগুলির একটি বৈধ ডিফল্ট মান পাওয়া উচিত। useCurrent()আপনার টাইমস্ট্যাম্পগুলি বর্তমান টাইমস্ট্যাম্পগুলিতে ডিফল্ট করতে আপনার স্থানান্তরগুলিতে (লারাভেল ৫.১.২৫ এবং উপরে থেকে) কলাম পরিবর্তনকারী ব্যবহার করতে পারেন , বা nullable()নাল মানকে অনুমতি দেওয়ার জন্য আপনি টাইমস্ট্যাম্পগুলি তৈরি করতে পারেন ।

  • পোস্টগ্রেএসকিউএল এবং লারাভেল ৪.x

    লারাভেল ৪.x সংস্করণে পোস্টগ্র্রেএসকিউএল ড্রাইভার টাইমস্ট্যাম্প মানগুলি সঞ্চয় করতে ডিফল্ট ডাটাবেস যথার্থতা ব্যবহার করছিল। CURRENT_TIMESTAMPডিফল্ট নির্ভুলতার সাথে কলামে ফাংশনটি ব্যবহার করার সময় , পোস্টগ্রেএসকিউএল উপলব্ধ উচ্চতর নির্ভুলতার সাথে একটি টাইমস্ট্যাম্প তৈরি করে, এইভাবে একটি ভগ্নাংশ দ্বিতীয় অংশের সাথে একটি টাইমস্ট্যাম্প তৈরি করে - এই এসকিউএল ফিডলটি দেখুন

    এটি কার্বনকে একটি টাইমস্ট্যাম্প পার্স করতে ব্যর্থ করবে যেহেতু এটি মাইক্রোসেকেন্ডগুলি সংরক্ষণের আশা করবে না। আপনার অ্যাপ্লিকেশনটিকে এই অপ্রত্যাশিত আচরণটি ভঙ্গ করতে এড়াতে আপনাকে CURRENT_TIMESTAMPনীচের মত স্পষ্ট করে ফাংশনটিতে একটি শূন্য স্পষ্টতা দিতে হবে :

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

    লারাভেল ৫.০ থেকে, timestamp()কলামগুলি শূন্যের ডিফল্ট নির্ভুলতা ব্যবহার করতে পরিবর্তিত হয়েছে যা এড়ানো যায়।

    মন্তব্যে এই ইস্যুটি দেখানোর জন্য @ ওয়ানড্রএইচএলকে ধন্যবাদ জানাই


ওয়ে ভাল পরামর্শ তারপর আমার। আমার DB::statementউদাহরণের পরিবর্তে এটি ব্যবহার করুন , এটি অনেক সহজ।
মার্ভেলেন

আপনার পরীক্ষাগুলিতে পার্টিশন বাই স্টেটমেন্টের জন্যও কি এটি ব্যবহার করা যেতে পারে?
গ্লেন প্লাস

2
নির্দোষভাবে নয়। পোস্টগ্রিএসকিউএল-এর জন্য 'CURRENT_TIMESTAMP': 2014-08-11 15: 06: 29.692439 এর ফর্ম্যাটে কিছু প্রত্যাবর্তন করে। এর ফলে কার্বন :: ক্রিয়েটফর্মফর্ম্যাট ('ওয়াইএমডি এইচ: আই: এস', $ টাইমস্ট্যাম্প) পদ্ধতিটি ব্যর্থ হয়ে যায় (এটি পিছনের মিলিসেকেন্ডগুলি পার্স করতে পারে না)। টাইমস্ট্যাম্পগুলি অ্যাক্সেস করার সময় লারাভেল এটি ব্যবহার করেন। পোস্টগ্রেএসকিউএল ঠিক করার জন্য, ডিবি :: কাঁচা ('এখন () :: টাইমস্ট্যাম্প (0)') (রেফারেন্স: postgresql.org/docs/8.1/static/… )
andrehl

@ অ্যান্ড্রয়েহল আসলে আমি কেবল মাইএসকিউএলের জন্য জবাব দিয়েছি, যেহেতু এটি প্রশ্নের বিষয়। তবে আমাদের সাথে এটি ভাগ করে নেওয়ার জন্য ধন্যবাদ, আমি আমার উত্তরটি coverাকতে আপডেট করব! :)
পাওলো ফ্রেইটাস

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'));

একাধিক কলাম সহ আপনার মাইএসকিউএল সংস্করণ> = 5.6.5 লাগবে CURRENT_TIMESTAMP


3
শুধু ব্যবহার $table->timestamps()->default(DB::raw('CURRENT_TIMESTAMP'));করবেন না কেন ?
ডেভ

1
@ ডেভ কারণ যেহেতু updated_atরেকর্ডটি প্রাথমিকভাবে তৈরির পরে সংশোধন করা হয়েছিল তখন পরিবর্তন হবে না
এরিক বার্কুন-ড্রেভনিগ

হ্যাঁ, সেই টাইমস্ট্যাম্পগুলিতে যুক্ত করুন () যাইহোক ডিফল্টগুলির জন্য অনুমতি দেয় না, যাতে এটি কোনওভাবেই কাজ করে না। এটির অনুমতি দেওয়ার জন্য আমি কোডটি প্রতিশ্রুতিবদ্ধ ছিলাম, তবে লারাভেল ম্যানেজাররা সত্যিই চান না যে আমরা এটি ব্যবহার করার পথে লোকেরা ডিফল্ট ব্যবহার করে (ধরে নিচ্ছি যে মাইএসকিউএল-এর সংস্করণ 5.6.5 এর পূর্বে ডিফল্ট হিসাবে টাইমস্ট্যাম্পযুক্ত একাধিক কলামকে মঞ্জুরি দেয় না)।
ডেভ

আসলে আপডেটড_এটি এলোভেন্ট দ্বারা পরিচালিত হয় তাই কোনও মডেল স্বয়ংক্রিয়ভাবে আপডেট হওয়ার পরে সেট করা হবে বলে "অন আপডেট" বিটের কোনও প্রয়োজন নেই।
dmyers

@dmyers আপনি যদি বুদ্ধিমান ব্যবহার করছেন তবে আপনি তা করতে পারেন $t->timestamps();তবে এটি প্রশ্নের উত্তর দেয় না।
ব্রায়ান অ্যাডামস

44

লারাভেল 5.1.26 থেকে শুরু করে 2015-12-02-এ ট্যাগ হয়েছে, একটি useCurrent()সংশোধক যুক্ত করা হয়েছে:

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

PR 10962 (এরপরে 15c487fe প্রতিশ্রুতিবদ্ধ ) এই সংযোজনে নেতৃত্ব দিয়েছে।

এছাড়াও আপনি বিষয় পড়তে চান পারে 3602 এবং 11518 সুদের যা।

মূলত, মাইএসকিউএল ৫.7 (ডিফল্ট কনফিগারেশন সহ) আপনাকে ডিফল্ট মান নির্ধারণ করতে হবে বা সময় ক্ষেত্রগুলির জন্য ছোট করতে হবে।


10

এটি সত্যের পক্ষে কাজ করে না:

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

এটি 'ডিফল্ট 0' সরিয়ে দেয় না যা মনে হয় টাইমস্ট্যাম্প নির্বাচন করে আসে এবং এটি কেবলমাত্র কাস্টম ডিফল্ট সংযোজন করে। তবে আমাদের এক প্রকারের উদ্ধৃতি ব্যতীত এটি দরকার। যে কোনও ডিবি হেরফের করে তা লারাভেল 4 থেকে আসে না। এটাই তাঁর বক্তব্য। তিনি নির্দিষ্ট কলামগুলিতে কাস্টম ডিফল্ট চান যেমন:

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

লারাভেলের সাথে এটা সম্ভব বলে আমি মনে করি না। এটি সম্ভব কিনা তা দেখার জন্য আমি এখন এক ঘন্টা অনুসন্ধান করেছি।


আপডেট: পাওলো ফ্রেইটার উত্তরটি দেখায় যে এটি সম্ভব, তবে বাক্য গঠনটি সোজা নয়।


গ্রেট। পারফেক্ট স্টাফ থাম্বস আপ, এটি আমাকেও সহায়তা করেছিল।
গ্লেন প্লাস

কিছুটা মন্তব্য করার আগে, চিৎকার করার আগে: লারাভেলে এটি আমার পক্ষে কাজ করে না, এই উত্তরটি যে তারিখটিতে লেখা হয়েছিল তার তারিখটি একবার দেখুন: এটি তখন কার্যকর ছিল। আপনি ডাউন তীরটি ট্যাপ করার আগে আমি এটির প্রশংসা করব।
গ্লেন প্লাস

9

ভবিষ্যতের গুগলদের অতিরিক্ত সম্ভাবনা হিসাবে

আমি এটা আরো উপযোগী আছে এটি নাল updated_at কলামে যখন রেকর্ড তৈরি করা হয় কিন্তু পরিবর্তিত হয়েছে না হয়েছে । এটি ডিবি আকার হ্রাস করে (ঠিক আছে, কেবলমাত্র একটু) এবং এটি প্রথম দর্শনে এটি দেখা সম্ভব যে ডেটা কখনই সংশোধন করা হয়নি।

এটি হিসাবে আমি ব্যবহার:

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

(মাইএসকিএল 8 সহ লারাভেল 7 এ)।


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

এইভাবে আপনি এটি করেন, আমি এটি পরীক্ষা করেছি এবং এটি আমার লারাভেল ৪.২ এ কাজ করে।

$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/migration#creating- কলামগুলি


12
তবে এটি ডিফল্টটিকে CURRENT_TIMESTAMP হিসাবে প্রশ্নে জিজ্ঞাসা করা হয়নি হিসাবে সেট করে না।
জোশ

আমি এটি চেষ্টা করে দেখি, তবে কেন 5.4 আইডিকে নালাগুলি দেওয়া হচ্ছে, তবে যখন আমি চেষ্টা করি -> ইউজ করেন্ট (); এটির কাজটি ভাল
অ্যান্থনি কাল

প্রশ্নে না উত্তর নেই 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'));
হামজা রশিদ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.