ปิดใช้งานการประทับเวลา Eloquent ของ Laravel


186

ฉันอยู่ระหว่างการแปลงหนึ่งในเว็บแอปพลิเคชันของเราจาก CodeIgniter เป็น Laravel อย่างไรก็ตามในขณะนี้เราไม่ต้องการเพิ่มupdated_at/ created_atเขตข้อมูลลงในตารางทั้งหมดของเราเนื่องจากเรามีคลาสการบันทึกที่ทำทั้งหมดนี้ในเชิงลึกมากขึ้นสำหรับเราแล้ว

ฉันรู้ว่าฉันสามารถตั้งค่า$timestamps = false;ใน:

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

อย่างไรก็ตามฉันไม่ต้องการเปลี่ยนไฟล์หลักสำหรับ Laravel หรือให้ทุกคนในแบบจำลองของฉันมีที่ด้านบน มีวิธีใดบ้างในการปิดการใช้งานที่อื่นในทุกรุ่น?

คำตอบ:


360

คุณต้องประกาศpublic $timestamps = false;ในทุกรุ่นหรือสร้าง BaseModel กำหนดไว้ที่นั่นและให้ทุกรุ่นของคุณขยายออกไปแทนที่จะเป็นฝีปาก เพียงในใจตารางเดือยจะต้องมีการประทับเวลาถ้าคุณใช้ Eloquent

อัปเดต: โปรดทราบว่าการประทับเวลาจะไม่ต้องใช้อีกต่อไปในตารางเดือยหลังจาก Laravel v3

อัปเดต: คุณยังสามารถปิดใช้งานการประทับเวลาโดยลบออก$table->timestamps()จากการย้ายข้อมูลของคุณ


1
ไม่ทราบว่าทำไมฉันไม่เคยคิดที่จะทำ BaseModel และตั้งค่าไว้ที่นั่น ทำงานได้อย่างสวยงาม เพียงบันทึกตามตารางสาระสำคัญเอกสารจำเป็นต้องใช้เฉพาะในกรณีที่การตั้งค่าด้วย Timestamps () ตอนนี้ (ไม่ทราบว่าสิ่งนี้เปลี่ยนจากรุ่นก่อนหน้า)
projectxmatt

ไม่ทราบวิธีการ withTimestamps () ฉันจะต้องดูมัน
bgallagh3r

@ bgallagh3r มีอยู่แล้วเพื่อ diasble เฉพาะสำหรับแบบสอบถาม perticuler, ช่วยบอกว่าสำหรับการแสดงแบบอักษรฉันไม่ต้องการเวลา แต่สำหรับแบ็กเอนด์ฉันต้องการประทับเวลา อย่างไรก็ตามมีการทำเช่นนั้น?
user7747472

10
เมื่อลบ $ table-> timestamps () ออกจากการโยกย้ายฝีปากจะยังคงรวมอยู่ในแบบสอบถาม สิ่งนี้นำไปสู่ข้อผิดพลาดเนื่องจากไม่มีฟิลด์ คำตอบที่ดีเป็นอย่างอื่น
Thijs Steel

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 () พาเรนต์ created_at จะทำงานได้ตามปกติ เช่นเดียวกับที่คุณสามารถเขียนวิธีการปิดใช้งานการอัปเดต created_at เท่านั้น


2
สิ่งนี้ใช้ได้ผลสำหรับฉันเพราะการตั้งค่า $ timestamps = false ทำให้ created_at-> diffForHumans () วิธีการหยุดทำงานเนื่องจากไม่มีอินสแตนซ์ของคาร์บอนอีกต่อไป
Nivin

มันใช้งานได้สำหรับฉันวิธีนี้เพียงปิดการใช้งานเขตข้อมูล updated_at ที่ฉันต้องการขอบคุณ
Radames E. Hernandez

22

หากคุณใช้ 5.5.x:

const UPDATED_AT = null;

และสำหรับฟิลด์ 'created_at' คุณสามารถใช้:

const CREATED_AT = null;

ตรวจสอบให้แน่ใจว่าคุณใช้เวอร์ชั่นล่าสุด (สิ่งนี้หักใน Laravel 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
นี่ควรเป็นคำตอบที่ดีที่สุด หากคุณมีฐานข้อมูลการผลิตที่มีอยู่คุณจะต้องเรียกใช้การย้ายข้อมูลรวมถึงปิดใช้งานการประทับเวลาของรุ่น
แบรด


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.