Vô hiệu hóa dấu thời gian Eloquent của Laravel


184

Tôi đang trong quá trình chuyển đổi một trong những ứng dụng web của chúng tôi từ CodeIgniter sang Laravel. Tuy nhiên, tại thời điểm này, chúng tôi không muốn thêm updated_at/ created_atcác trường vào tất cả các bảng của mình vì chúng tôi đã có một lớp ghi nhật ký thực hiện tất cả điều này sâu hơn cho chúng tôi.

Tôi biết tôi có thể thiết lập $timestamps = false;:

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

Tuy nhiên, tôi không muốn thay đổi một tệp cốt lõi cho Laravel hoặc để mọi người trong số các mô hình của tôi có thứ đó ở trên cùng. Có cách nào để vô hiệu hóa điều này ở nơi khác cho tất cả các mô hình?

Câu trả lời:


358

Bạn phải khai báo public $timestamps = false;trong mọi mô hình hoặc tạo BaseModel, xác định nó ở đó và để tất cả các mô hình của bạn mở rộng nó thay vì hùng hồn. Chỉ cần lưu ý các bảng xoay vòng PHẢI có dấu thời gian nếu bạn đang sử dụng Eloquent.

Cập nhật: Lưu ý rằng dấu thời gian không còn BẮT BUỘC trong các bảng trục sau Laravel v3.

Cập nhật: Bạn cũng có thể tắt dấu thời gian bằng cách xóa $table->timestamps()khỏi di chuyển của mình.


1
Không biết tại sao tôi không bao giờ nghĩ đến việc làm BaseModel và đặt nó ở đó. Hoạt động rất đẹp. Chỉ cần một ghi chú theo bảng xoay tài liệu chỉ cần nó khi thiết lập withTimestamp () ngay bây giờ (không biết điều này có thay đổi so với các phiên bản trước không)
projectxmatt

Không biết phương thức withTimestamp (). Tôi sẽ cần xem xét nó.
bgallagh3r

@ bgallagh3r, dù sao cũng chỉ có thể di chuyển cho truy vấn perticuler, Hãy nói rằng để hiển thị fontend tôi không muốn dấu thời gian, nhưng đối với phụ trợ tôi muốn đóng dấu thời gian. Có cách nào để làm như vậy?
dùng7747472

8
Khi xóa $ bảng-> dấu thời gian () khỏi di chuyển, tài hùng biện vẫn sẽ đưa chúng vào truy vấn. Điều này dẫn đến một lỗi vì trường không tồn tại. Nếu không thì trả lời tuyệt vời.
Thijs Steel

114

Chỉ cần đặt dòng này trong Mô hình của bạn :

public $timestamps = false;

Và đó là nó!


Thí dụ:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Post extends Model
{
    public $timestamps = false;

    //
}

Để tắt dấu thời gian cho một thao tác (ví dụ: trong bộ điều khiển):

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

Để tắt dấu thời gian cho tất cả các Mô hình của bạn , hãy tạo một BaseModeltệp mới :

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class BaseModel extends Model
{
    public $timestamps = false;

    //
}

Sau đó mở rộng từng Mô hình của bạn bằng BaseModel, như vậy:

<?php

namespace App;

class Post extends BaseModel
{
    //
}

22

Nếu bạn chỉ cần vô hiệu hóa cập nhật update_at, chỉ cần thêm phương thức này vào mô hình của bạn.

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

Điều này sẽ ghi đè phương thức setUpdatedAtAttribution () gốc. created_at sẽ hoạt động như bình thường. Tương tự như cách bạn có thể viết một phương thức để chỉ vô hiệu hóa cập nhật created_at.


2
Điều này hiệu quả với tôi vì thiết lập phương thức $ timestamp = false khiến cho phương thức created_at-> diffForHumans () ngừng hoạt động vì nó không còn là một thể hiện carbon nữa.
Nivin

Nó hoạt động với tôi, phương pháp này chỉ vô hiệu hóa trường update_at mà tôi cần, cảm ơn
Radames E. Hernandez

21

Nếu bạn đang sử dụng 5.5.x:

const UPDATED_AT = null;

Và đối với trường 'created_at', bạn có thể sử dụng:

const CREATED_AT = null;

Hãy chắc chắn rằng bạn đang ở phiên bản mới nhất. (Điều này đã bị hỏng trong Laravel 5.5.0 và được sửa lại trong 5.5.5).


10

Mô hình xuất sắc:

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

    public $timestamps = false;
}

Hoặc đơn giản là thử cái này

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

9

Trong trường hợp bạn muốn xóa dấu thời gian khỏi mô hình hiện có, như đã đề cập trước đó, hãy đặt mô hình này vào Mô hình của bạn:

public $timestamps = false;

Đồng thời tạo một di chuyển với mã sau trong up()phương thức và chạy nó:

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

Bạn có thể sử dụng $table->timestamps()trong down()phương pháp của bạn để cho phép quay trở lại.


1
Đây phải là câu trả lời tốt nhất. Nếu bạn có cơ sở dữ liệu sản xuất hiện có, bạn cần chạy di chuyển cũng như vô hiệu hóa dấu thời gian trên mô hình.
brad

6

chỉ cần khai báo các publicbiến timestamps ở của bạn Modelđến falsevà mọi thứ sẽ làm việc tuyệt vời.

public $timestamps = false;


5

Thêm dòng này vào mô hình của bạn:

Ghi đè biến hiện có $timestamps đúng thành sai

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

public $timestamps = false;

1

Ghi đè các chức năng setUpdatedAt()getUpdatedAtColumn()trong mô hình của bạn

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

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

20
Một trường hợp "nó hoạt động nhưng không ai trong tâm trí của họ thực sự sẽ làm điều này"
nhà phát triển xe máy

1

Bạn có thể tạm thời vô hiệu hóa dấu thời gian

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

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

$user->timestamps=$timestamps;   // restore timestamps
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.