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.