লারাভেলের সুস্পষ্ট টাইমস্ট্যাম্পগুলি অক্ষম করুন


184

আমি আমাদের ওয়েব অ্যাপ্লিকেশনগুলির মধ্যে একটি কোডইগিনিটার থেকে লারাভেলে রূপান্তর করার প্রক্রিয়াধীন। তবে এই মুহুর্তে আমরা আমাদের সমস্ত টেবিলগুলিতে updated_at/ created_atক্ষেত্রগুলি যুক্ত করতে চাই না কারণ আমাদের একটি লগিং ক্লাস রয়েছে যা ইতিমধ্যে আমাদের জন্য আরও গভীরতায় এই সমস্ত করে।

আমি সচেতন যে আমি সেট করতে পারি $timestamps = false;:

Vendor\laravel\framework\src\illuminate\Datebase\Eloquent\Model.php

তবে আমি বরং লারাভেলের জন্য কোনও মূল ফাইলটি পরিবর্তন করব না, বা আমার মডেলগুলির প্রত্যেকের কাছে এটি আছে। সমস্ত মডেলের জন্য অন্য কোথাও এটি অক্ষম করার কোনও উপায় আছে?

উত্তর:


358

আপনাকে public $timestamps = false;প্রতিটি মডেলেই ঘোষণা করতে হবে , বা একটি বেসমোডেল তৈরি করতে হবে, সেখানে এটি সংজ্ঞায়িত করতে হবে এবং আপনার সমস্ত মডেলগুলি সুস্পষ্টর পরিবর্তে এটি প্রসারিত করতে হবে। পিভট টেবিলগুলি কেবল মনে রাখবেন আপনি যদি অবলীল ব্যবহার করছেন তবে টাইমস্ট্যাম্প থাকা আবশ্যক।

আপডেট: নোট করুন যে টাইমস্ট্যাম্পগুলি লারাভেল v3 এর পরে পিভট টেবিলগুলিতে আর প্রয়োজনীয় নয়।

আপডেট: আপনি $table->timestamps()নিজের স্থানান্তর থেকে সরিয়ে টাইমস্ট্যাম্পগুলি অক্ষম করতে পারেন ।


1
জানি না কেন আমি কখনই বেসমোডেল করার এবং এটি স্থাপন করার কথা ভাবি নি। সুন্দর কাজ করে। ডকুমেন্টেশন পিভট টেবিল অনুসারে কেবলমাত্র একটি নোটের প্রয়োজন কেবলমাত্র টাইমস্ট্যাম্পগুলি () এখন (যদি এটি পূর্ববর্তী সংস্করণগুলি থেকে পরিবর্তিত হয় কিনা) সাথে সেট করে থাকে তবে
প্রজেক্টম্যাট

টাইমস্ট্যাম্পস () পদ্ধতিটি সম্পর্কে অবগত ছিল না। আমি এটি খতিয়ে দেখা প্রয়োজন।
bgallagh3r

@ ব্যাগলাগ থ্রিআর, কেবলমাত্র পেরিকুলার ক্যোয়ারির জন্যই ডায়সবল করার মতো উপায় আছে, ফোন্টেট ডিসপ্লেতে বলি যে আমি টাইমস্ট্যাম্প চাই না, তবে ব্যাকএন্ডের জন্য আমি টাইম স্ট্যাম্প চাই। যাইহোক এমন কি আছে?
user7747472

8
মাইগ্রেশন থেকে $ টেবিল-> টাইমস্ট্যাম্পগুলি () সরিয়ে দেওয়ার সময়, স্পষ্টত তাদের এখনও কোয়েরিতে অন্তর্ভুক্ত করবে। ক্ষেত্রটি বিদ্যমান না থাকায় এটি একটি ত্রুটি বাড়ে। অন্যথায় দুর্দান্ত উত্তর।
থিজ স্টিল

114

কেবল আপনার মডেলটিতে এই লাইনটি রাখুন :

public $timestamps = false;

এবং এটাই!


উদাহরণ:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Post extends Model
{
    public $timestamps = false;

    //
}

একটি ক্রিয়াকলাপের জন্য টাইমস্ট্যাম্পগুলি অক্ষম করতে (যেমন একটি নিয়ামক হিসাবে):

$post->content = 'Your content'; 
$post->timestamps = false; // Will not modify the timestamps on save
$post->save();

আপনার সমস্ত মডেলের টাইমস্ট্যাম্পগুলি অক্ষম করতে , একটি নতুন BaseModelফাইল তৈরি করুন:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class BaseModel extends Model
{
    public $timestamps = false;

    //
}

তারপরে আপনার প্রতিটি মডেলগুলির সাথে প্রসারিত করুন BaseModel, এর মতো:

<?php

namespace App;

class Post extends BaseModel
{
    //
}

22

আপনার কেবল আপডেট আপডেট করা অক্ষম করার প্রয়োজন হলে এটি কেবল আপনার মডেলটিতে এই পদ্ধতিটি যুক্ত করুন।

public function setUpdatedAtAttribute($value)
{
    // to Disable updated_at
}

এটি প্যারেন্ট সেটআপডেটএটএট্রিবিউট () পদ্ধতিটিকে ওভাররাইড করবে। তৈরি_এটি যথারীতি কাজ করবে। একইভাবে আপনি কেবল তৈরি_এটি আপডেট করা অক্ষম করার জন্য কোনও পদ্ধতি লিখতে পারেন।


2
এটি আমার পক্ষে কাজ করেছে কারণ $ টাইমস্ট্যাম্পস = মিথ্যা সৃষ্টি করেছে_আট-> ডিফারফর্মহিউম্যানস () পদ্ধতিটি কাজ করা বন্ধ করার কারণ এটি আর কার্বন নয়।
নিভিন

এটি আমার পক্ষে কাজ করে, এই পদ্ধতিটি কেবল আপডেট_এই ক্ষেত্রটি অক্ষম করে যা আমার প্রয়োজন, ধন্যবাদ
রডেমস ই হার্নান্দেজ

21

আপনি যদি 5.5.x ব্যবহার করেন:

const UPDATED_AT = null;

এবং 'created_at' ক্ষেত্রের জন্য, আপনি ব্যবহার করতে পারেন:

const CREATED_AT = null;

আপনি নতুন সংস্করণে রয়েছেন তা নিশ্চিত করুন। (এটি লারাভেল 5.5.0 এ ভাঙ্গা হয়েছিল এবং 5.5.5 এ আবার স্থির হয়েছিল)।


10

স্বতন্ত্র মডেল:

class User extends Model    
{      
    protected $table = 'users';

    public $timestamps = false;
}

বা সহজভাবে এটি চেষ্টা করুন

$users = new Users();
$users->timestamps = false;
$users->name = 'John Doe';
$users->email = 'johndoe@example.com';
$users->save();

9

আপনি আগে যেমন উল্লিখিত মডেল থেকে টাইমস্ট্যাম্পগুলি সরাতে চান সে ক্ষেত্রে এটি আপনার মডেলটিতে রাখুন:

public $timestamps = false;

up()পদ্ধতিতে নিম্নলিখিত কোড সহ একটি স্থানান্তর তৈরি করুন এবং এটি চালান:

Schema::table('your_model_table', function (Blueprint $table) {
    $table->dropTimestamps();
});

পিছনে ঘুরিয়ে দেওয়ার জন্য $table->timestamps()আপনি আপনার down()পদ্ধতিতে ব্যবহার করতে পারেন ।


1
এটি সেরা উত্তর হওয়া উচিত। আপনার যদি বিদ্যমান প্রোডাক্ট ডাটাবেস থাকে তবে আপনাকে একটি মাইগ্রেশন চালানোর পাশাপাশি মডেলের টাইমস্ট্যাম্পগুলি অক্ষম করতে হবে।
ব্র্যাড

6

শুধু publicআপনার Modelকাছে টাইমস্ট্যাম্পগুলি পরিবর্তনশীল ঘোষণা করুন falseএবং সবকিছু দুর্দান্ত কাজ করবে।

public $timestamps = false;


5

আপনার মডেলটিতে এই লাইনটি যুক্ত করুন:

ওভাররাইট পরিবর্তনশীল বিদ্যমান $timestamps সত্য থেকে মিথ্যা

/**
 * Indicates if the model should be timestamped.
 *
 * @var bool
 */

public $timestamps = false;

1

ফাংশন ওভাররাইড setUpdatedAt()এবং getUpdatedAtColumn()আপনার মডেল

public function setUpdatedAt($value)
{
   //Do-nothing
}

public function getUpdatedAtColumn()
{
    //Do-nothing
}

20
একটা ঘটনা "এটি কাজ করে কিন্তু তাদের অধিকার মনে কেউ আসলে এই কাজ করতে হবে"
developerbmw

1

আপনি অস্থায়ীভাবে টাইমস্ট্যাম্পগুলি অক্ষম করতে পারেন

$timestamps = $user->timestamps;
$user->timestamps=false;   // avoid view updating the timestamp

$user->last_logged_in_at = now();
$user->save();

$user->timestamps=$timestamps;   // restore timestamps
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.