Nonaktifkan stempel waktu Laravel's Eloquent


186

Saya sedang dalam proses mengubah salah satu aplikasi web kami dari CodeIgniter ke Laravel. Namun saat ini kami tidak ingin menambahkan updated_at/ created_atbidang ke semua tabel kami karena kami memiliki kelas logging yang melakukan semua ini secara lebih mendalam bagi kami.

Saya sadar saya dapat mengatur $timestamps = false;:

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

Namun saya lebih suka tidak mengubah file inti untuk Laravel, atau memiliki semua model saya memiliki yang di atas. Apakah ada cara untuk menonaktifkan ini di tempat lain untuk semua model?

Jawaban:


360

Anda harus mendeklarasikan public $timestamps = false;dalam setiap model, atau membuat BaseModel, mendefinisikannya di sana, dan minta semua model Anda memperpanjangnya alih-alih fasih. Hanya ingat tabel pivot harus HARUS memiliki cap waktu jika Anda menggunakan Eloquent.

Pembaruan: Perhatikan bahwa cap waktu tidak lagi DIBUTUHKAN dalam tabel pivot setelah Laravel v3.

Pembaruan: Anda juga dapat menonaktifkan cap waktu dengan menghapus $table->timestamps()dari migrasi Anda.


1
Tidak tahu mengapa saya tidak pernah berpikir untuk melakukan BaseModel dan mengaturnya di sana. Bekerja dengan indah. Hanya catatan sesuai dengan tabel pivot dokumentasi yang memerlukannya hanya jika menyetel denganTimestamps () sekarang (tidak tahu apakah ini berubah dari versi sebelumnya)
projectxmatt

Tidak mengetahui metode withTimestamps (). Saya harus memeriksanya.
bgallagh3r

@ bgallagh3r, apakah ada untuk diasble hanya untuk permintaan perticuler, Katakanlah untuk tampilan fontend saya tidak ingin timestamp, tetapi untuk backend saya ingin cap waktu. Apakah ada cara untuk melakukannya?
user7747472

10
Saat menghapus $ table-> cap waktu () dari migrasi, fasih akan tetap memasukkannya ke dalam kueri. Ini mengarah ke kesalahan karena bidang tidak ada. Kalau tidak jawaban yang bagus.
Thijs Steel

115

Cukup letakkan baris ini di Model Anda :

public $timestamps = false;

Dan itu dia!


Contoh:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Post extends Model
{
    public $timestamps = false;

    //
}

Untuk menonaktifkan cap waktu untuk satu operasi (mis. Dalam pengontrol):

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

Untuk menonaktifkan cap waktu untuk semua Model Anda , buat BaseModelfile baru :

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class BaseModel extends Model
{
    public $timestamps = false;

    //
}

Kemudian rentangkan masing-masing Model Anda dengan BaseModel, seperti:

<?php

namespace App;

class Post extends BaseModel
{
    //
}

22

Jika Anda hanya perlu menonaktifkan pemutakhiran updated_at cukup tambahkan metode ini ke model Anda.

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

Ini akan menimpa metode setUpdatedAtAttribute () induk. Created_at akan berfungsi seperti biasa. Dengan cara yang sama Anda dapat menulis metode untuk menonaktifkan pembaruan yang dibuat saja.


2
Ini bekerja untuk saya karena menyetel $ timestamps = false disebabkan metode diciptakan_at-> diffForHumans () untuk berhenti bekerja karena itu bukan lagi contoh karbon.
Nivin

Ini berfungsi untuk saya, metode ini cukup nonaktifkan bidang updated_at yang saya butuhkan, terima kasih
Radames E. Hernandez

22

Jika Anda menggunakan 5.5.x:

const UPDATED_AT = null;

Dan untuk bidang 'Created_at', Anda dapat menggunakan:

const CREATED_AT = null;

Pastikan Anda berada di versi terbaru. (Ini rusak di Laravel 5.5.0 dan diperbaiki lagi di 5.5.5).


11

Model Mahir:

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

    public $timestamps = false;
}

Atau Cukup coba ini

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

9

Jika Anda ingin menghapus cap waktu dari model yang ada, seperti yang disebutkan sebelumnya, letakkan ini di Model Anda:

public $timestamps = false;

Juga buat migrasi dengan kode berikut dalam up()metode dan jalankan:

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

Anda dapat menggunakan metode $table->timestamps()Anda down()untuk memungkinkan memutar kembali.


1
Ini harus menjadi jawaban terbaik. Jika Anda memiliki database produksi yang ada, Anda harus menjalankan migrasi serta menonaktifkan cap waktu pada model.
brad

7

cukup deklarasikan publicvariabel cap waktu di Modelto falsedan semuanya akan bekerja dengan baik.

public $timestamps = false;


5

Tambahkan baris ini ke dalam model Anda:

Timpa variabel yang ada $timestamps true ke false

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

public $timestamps = false;

1

Ganti fungsi setUpdatedAt()dan getUpdatedAtColumn()dalam model Anda

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

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

20
Sebuah kasus "itu bekerja tetapi tidak ada orang yang waras yang benar-benar akan melakukan ini"
developerbmw

1

Anda dapat menonaktifkan cap waktu sementara

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

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

$user->timestamps=$timestamps;   // restore timestamps
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.