Laravel'in Anlık zaman damgalarını devre dışı bırak


187

Web uygulamalarımızdan birini CodeIgniter'dan Laravel'e dönüştürme sürecindeyim. Ancak şu anda tüm alanları daha derinlemesine yapan bir kayıt sınıfımız olduğundan, tüm tablolarımıza updated_at/ created_atalanlarını eklemek istemiyoruz .

Ayarlayabileceğimin farkındayım $timestamps = false;:

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

Ancak Laravel için bir çekirdek dosyayı değiştirmek istemiyorum veya modellerimin hepsinin üstte olmasını istiyorum. Tüm modeller için bunu başka bir yerde devre dışı bırakmanın bir yolu var mı?

Yanıtlar:


361

public $timestamps = false;Her modelde beyan etmeniz veya bir BaseModel oluşturmanız, orada tanımlamanız ve tüm modellerinizin anlamlı olmak yerine onu genişletmesini sağlamanız gerekir. Eloquent kullanıyorsanız, pivot tabloların zaman damgalarına sahip olması GEREKİR.

Güncelleme: Laravel v3'ten sonra pivot tablolarda zaman damgalarının GEREKLİ OLMADIĞINI unutmayın.

Güncelleme: Zaman damgalarını $table->timestamps()taşıma işleminizden kaldırarak da devre dışı bırakabilirsiniz .


1
Neden bir BaseModel yapmayı ve orada ayarlamayı düşünmediğimi bilmiyorum. Güzel çalışıyor. Sadece belge pivot tablolarına göre bir not, sadece şimdiTimestamps () ile ayarlandığında gerekir (bunun önceki sürümlerden değişip değişmediğini bilmiyorum)
— projectxmatt

WithTimestamps () yönteminin farkında değildi. Buna bakmam gerekecek.
— bgallagh3r

@ bgallagh3r, sadece perticuler sorgusu için diasble var, zaman damgası istemiyorum fontend ekran için diyelim, ama arka uç için zaman damgası istiyorum. Bunun için yine de var mı?
— user7747472

10
$ Table-> timestamps () öğesini taşıma işleminden kaldırırken, eloquent bunları sorguya dahil edecektir. Alan olmadığından bu bir hataya yol açar. Aksi takdirde harika bir cevap.
— Thijs Steel

115

Bu satırı Modelinize yerleştirin :

public $timestamps = false;

Ve bu kadar!


Misal:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Post extends Model
{
    public $timestamps = false;

    //
}

Bir işlem için zaman damgalarını devre dışı bırakmak için (örneğin bir denetleyicide):

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

Tüm Modelleriniz için zaman damgalarını devre dışı bırakmak için yeni bir BaseModeldosya oluşturun:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class BaseModel extends Model
{
    public $timestamps = false;

    //
}

Ardından, Modellerinizin her birini şu şekilde genişletin BaseModel:

<?php

namespace App;

class Post extends BaseModel
{
    //
}

22

Yalnızca update_at güncellemesini devre dışı bırakmanız gerekiyorsa, bu yöntemi modelinize eklemeniz yeterlidir.

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

Bu, üst setUpdatedAtAttribute () yöntemini geçersiz kılar. created_at her zamanki gibi çalışır. Aynı şekilde yalnızca create_at güncellemesini devre dışı bırakmak için bir yöntem yazabilirsiniz.


2
Bu benim için işe yaradı, çünkü $ timestamps = false ayarı, artık bir karbon örneği olmadığından çalışmayı durdurmaya neden oldu.
— Nivin

Benim için çalışıyor, bu yöntem sadece ihtiyacım olan updated_at alanını devre dışı bırak, teşekkürler
— Radames E. Hernandez

22

5.5.x kullanıyorsanız:

const UPDATED_AT = null;

'Created_at' alanı için şunları kullanabilirsiniz:

const CREATED_AT = null;

En yeni sürümde olduğunuzdan emin olun. (Bu Laravel 5.5.0'da kırıldı ve tekrar 5.5.5'te düzeltildi).


11

Etkili Model:

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

    public $timestamps = false;
}

Veya basitçe şunu deneyin

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

9

Daha önce belirtildiği gibi mevcut modelden zaman damgalarını kaldırmak istiyorsanız, bunu Modelinize yerleştirin:

public $timestamps = false;

Ayrıca up()yöntemde aşağıdaki kodla bir taşıma oluşturun ve çalıştırın:

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

Sen kullanabilirsiniz $table->timestamps()senin içinde down()yuvarlanan geri izin yöntemle.


1
Bu en iyi cevap olmalı. Mevcut bir üretim veritabanınız varsa, bir geçiş çalıştırmanız ve modelde zaman damgalarını devre dışı bırakmanız gerekir.
— brad

7

Sadece beyan publicsenin içinde damgaları değişkeni Modeliçin falseve her şey harika çalışacaktır.

public $timestamps = false;


5

Bu satırı modelinize ekleyin:

Üzerine Yaz değişken mevcut $timestamps gerçek için YANLıŞ

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

public $timestamps = false;

1

İşlevleri geçersiz kıl setUpdatedAt()ve getUpdatedAtColumn()Modelinizdeki

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

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

20
"Çalışıyor ama sağ akıllarında hiç kimse bunu yapmaz" davası
— developerbmw

1

Zaman damgalarını geçici olarak devre dışı bırakabilirsiniz

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

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

$user->timestamps=$timestamps;   // restore timestamps
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.