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?

projectxmatt
sumber

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.

bgallagh3r
sumber
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
{
    //
}
PhilMarc
sumber
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.

Sampath Perera
sumber
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).

Sampath Perera
sumber
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 = '[email protected]';
$users->save();
srmilon
sumber
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.

permainan nyata
sumber
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;

Shahrukh Anwar
sumber
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;
Jignesh Joisar
sumber
1

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

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

public function getUpdatedAtColumn()
{
    //Do-nothing
}
Krishan
sumber
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
Snapey
sumber