लारवेल के एलोकेंट टाइमस्टैम्प को अक्षम करें


185

मैं अपने वेब अनुप्रयोगों में से एक कोडाइग्निटर से लारवेल में परिवर्तित करने की प्रक्रिया में हूं। हालाँकि इस समय हम अपने सभी तालिकाओं में updated_at/ created_atफ़ील्ड को जोड़ना नहीं चाहते हैं क्योंकि हमारे पास एक लॉगिंग वर्ग है जो यह सब हमारे लिए पहले से अधिक गहराई में करता है।

मुझे पता है कि मैं इसमें सेट कर सकता हूँ $timestamps = false;:

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

हालाँकि मैं लारवेल के लिए एक मुख्य फ़ाइल नहीं बदलूंगा, या मेरे सभी मॉडलों में शीर्ष पर है। क्या सभी मॉडलों के लिए इसे कहीं और अक्षम करने का कोई तरीका है?

जवाबों:


358

आपको या तो public $timestamps = false;प्रत्येक मॉडल में घोषणा करनी होगी , या एक बेसमॉडल बनाना होगा, इसे वहां परिभाषित करना होगा, और आपके सभी मॉडल वाक्पटु के बजाय इसका विस्तार करेंगे। यदि आप एलोकेंट का उपयोग कर रहे हैं, तो बस मन की धुरी तालिकाओं में नंगे होना आवश्यक है।

अपडेट: ध्यान दें कि लारवेल v3 के बाद टाइमस्टैम्प अब धुरी तालिकाओं में आवश्यक नहीं हैं।

अपडेट: आप $table->timestamps()अपने माइग्रेशन से हटाकर टाइमस्टैम्प को अक्षम भी कर सकते हैं ।


1
न जाने क्यों मैंने कभी बेसमॉडल करने और उसे वहां स्थापित करने के बारे में नहीं सोचा। खूबसूरती से काम करता है। दस्तावेज़ीकरण धुरी तालिकाओं के अनुसार बस एक नोट की आवश्यकता होती है, अगर इसे अभी भी सेट किया जाए तो withTimestamps () अब नहीं पता (यदि यह पिछले संस्करणों से बदला गया है)
Projectxmatt

WithTimestamps () विधि के बारे में पता नहीं था। मुझे इसमें देखने की आवश्यकता होगी।
bgallagh3r

@ bgallagh3r, वैसे भी केवल पर्टिकुलर क्वेरी के लिए डायस करने के लिए है, चलो फॉन्टेंड डिस्प्ले के लिए कहते हैं कि मुझे टाइमस्टैम्प नहीं चाहिए, लेकिन बैकएंड के लिए मुझे टाइम स्टैम्प चाहिए। क्या ऐसा करने के लिए कुछ भी है?
user7747472

9
माइग्रेशन से $ टेबल-> टाइमस्टैम्प () को हटाते समय, वाक्पटु अभी भी उन्हें क्वेरी में शामिल करेगा। यह एक त्रुटि की ओर जाता है क्योंकि फ़ील्ड मौजूद नहीं है। अन्यथा महान जवाब।
थाइज स्टील

115

इस लाइन को अपने मॉडल में रखें :

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
}

यह मूल setUpdatedAtAttribute () विधि को ओवरराइड करेगा। create_at हमेशा की तरह काम करेगा। उसी तरह से आप केवल create_at को अपडेट करने के लिए एक विधि लिख सकते हैं।


2
यह मेरे लिए काम कर रहा है क्योंकि $ टाइमस्टैम्प स्थापित करना = गलत कारण से बनाया गया_ट-> diffForHumans () विधि काम करना बंद कर देती है क्योंकि यह अब कार्बन उदाहरण नहीं है।
निविन

यह मेरे लिए काम करता है, यह तरीका सिर्फ अद्यतन की गई_टैब को अक्षम करता है जिसकी मुझे आवश्यकता है, धन्यवाद
Radames E. Hernandez

22

यदि आप 5.5.x का उपयोग कर रहे हैं:

const UPDATED_AT = null;

और 'create_at' फ़ील्ड के लिए, आप उपयोग कर सकते हैं:

const CREATED_AT = null;

सुनिश्चित करें कि आप नवीनतम संस्करण पर हैं। (यह लारावेल 5.5.0 में टूट गया और 5.5.5 में फिर से तय किया गया)।


11

शानदार मॉडल:

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अपने में timestamps चर 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
"यह काम करता है, लेकिन उनके दाहिने दिमाग में कोई भी वास्तव में ऐसा नहीं करेगा" का एक मामला
डेवलपर

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
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.