Tôi không muốn created_at, updated_at tự động chèn vô tội vạ

Tôi mới chuyển sang mần web với Laravel hơn một tháng nay, vui buồn lẫn lộn các bác ạ. Cảm nhận ban đầu khi phải chuyển qua một ngôn ngữ mới, một framework mới ờ thì phê thật. Tôi thấy được nhiều cái hay, mới lạ và cũng có một chút gì đó quen thuộc của Java, C# mà tôi đã từng làm bằng hữu. Nhìn chung, khi làm việc với nó, không có thứ gì phải chê bai, mọi thứ xử lý hết sức nhanh gọn lẹ, còn cái gì không nhanh gọn được thì chắc do tôi còn kém quá 😋

Không liên quan chút, hôm nay U23 Việt Nam thắng U23 Qatar tung bông nào 👙 💄

À, suýt nữa thì quên, cái created_at, updated_at trong Laravel dùng sướng đấy chứ nhỉ, không phải new Date rồi insert này nọ mà vẫn có được ngày giờ trong database, ai làm chức năng post bài, tin tức chắc hết vất vả rồi 😍 Nhưng nếu tạo mấy cái như danh mục, tùy chọn,... thì có cần thiết phải thêm created_at, updated_at không nhỉ? Tôi thấy nó thừa trong khi vẫn có thể cài đặt lại không để tự chèn vô tội vạ nhưng nhiều bạn không để ý, chèn vô đó thì kệ nó, mình không lấy thì thôi. Với tôi, tôi nghĩ nó sẽ làm database béo lên một tý, ổ đĩa vì thế cũng mất đi một khoảng để chứa một ít phim Hàn + Nhật rồi 😲

Thế là tôi loay hoay trừ khử nó

Search thôi nào, tất cả đều có hết trên google 💋

Tôi tìm được từ khóa liên quan đến 2 anh created_atupdated_attimestamps. Loay hoay một tý nữa mới biết nó là biến của model. Thử áp dụng vô project đang làm. Như một phép màu, được liền à.

Tôi đã tạo mới một item, sử dụng:

Item::create(['title'=>'ai lớp diu']);

Item Model thì như thế này:

<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Item extends Model
{
    public $fillable = ['title'];
}

Chắc các bạn cũng biết, khi chèn mới một item vào database, mặc định created_atupdated_at sẽ tự động được chèn với ngày giờ hiện tại, cùng với title có mặt trong table mà chúng ta mong muốn. Nhưng khi tôi thêm thuộc tính $timestamps cho class Item và gán cho nó giá trị false thì lúc tạo mới một item, 2 thông tin created_at, updated_at đã có giá trị là NULL

<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Item extends Model
{
    public $fillable = ['title'];
    public $timestamps = false;
}

Vậy là hoàn thành mục đích (Nếu bạn không muốn 2 trường đó có mặt trong table thì lúc tạo migration đừng bỏ $table->timestamps() vào, đồng thời set $timestamp = false như trên nhé)

Một chuyện khác

Thế có lúc nổi điên tôi lại muốn Laravel tự động insert chỉ created_at hoặc updated_at thôi thì phải làm thế lào :billed_cap: Dù không nổi điên thì thật sự trường hợp đó có nhé, cụ thể là khi nào thì các bạn tự hình dung vậy.

Nếu thật sự các bạn muốn vậy thì làm thế này

Muốn chỉ insert trường created_at

Thêm const UPDATED_AT vào model

<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Item extends Model
{
    public $fillable = ['title'];
    const UPDATED_AT = null;
}

Ngược lại, muốn chỉ insert updated_at

Thêm const CREATED_AT vào model

<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Item extends Model
{
    public $fillable = ['title'];
    const CREATED_AT = null;
}

Vâng, chỉ đơn giản vậy thôi mà đã làm mất của con nguyên một buổi tối không thể dẫn gấu đi chơi đó các bác ạ. Cái gì mới bắt đầu cũng khổ 😆

Bài viết chỉ mang tính chém gió là phần nhiều, kiến thức còn nông, lời văn chưa được bay bướm, hẹn gặp lại quý vị một ngày không xa.