Customizing Model Date Formats in Laravel

Hòa Nguyễn Coder

Published in Web Developer · Đã đăng vào tháng 2 12, 2025 2:25 PM

Đây là một tính năng tuyệt vời để custom các thuộc tính trước khi Response về phía Client. Trong Laravel khi ta trả về phía Client một data, chúng ta cần custom nó trước khi trả về, thông thường ta viết các điều kiện trong Controller hoặc Resource, Collection,...bắt cứ đâu

Nhưng nay mình tìm hiểu được cách ta custom nó trong Model luôn, rất thuận tiện cho việc fix bugs và quản lý việc custom của các trường field trong Model


use Illuminate\Database\Eloquent\Model;
use DateTimeInterface;
use Illuminate\Database\Eloquent\Casts\Attribute;
class Category extends Model
{
    protected $fillable = ['name', 'keyword', 'des', 'parent_id','slug','image','publish'];
    protected $casts = [
        'created_at' => 'datetime:Y-m-d H:i:s',
        'updated_at' => 'datetime:Y-m-d H:i:s',
    ];

    protected function serializeDate(DateTimeInterface $date)
    {
        return $date->format('Y-m-d H:i:s');
    }

    protected function updatedAtFormatted(): Attribute
    {
        return Attribute::make(
            get: fn () => $this->updated_at->format('l, F j, Y')
        );
    }

    public function toArray()
    {
        return array_merge(parent::toArray(), [

            'updated_at_formatted' => $this->updatedAtFormatted,

        ]);
    }
}

Trong đoạn code trên mình có custom date mặt định là theo kiểu định dạng "Y-m-d H:i:s" , Nhưng sau đó mình lại custom thêm thuộc tính updated_at về dạng $this->updated_at->format('l, F j, Y')

Mình tạo một function updatedAtFormatted() để xử lý việc format cho thuộc tính updated_at

Hàm toArray() trong Model nó sẽ tạo thêm một thuộc tính "updated_at_formatted" trong mảng array  bạn trả về phía Client

VD:


"dataCategory": [
        {
            "id": 1,
            "name": "Html/Css",
            "keyword": "Html,Css",
            "des": "Html,Css",
            "parent_id": 0,
            "slug": "html-css",
            "image": "https://cdn-icons-png.flaticon.com/512/174/174854.png",
            "publish": 1,
            "created_at": "2019-09-03 12:32:44",
            "updated_at": "2019-09-03 12:32:44",
            "updated_at_formatted": "Tuesday, September 3, 2019"
        },
        {
            "id": 2,
            "name": "Javascript/jquery",
            "keyword": "Javascript,jquery",
            "des": "Javascript,jquery",
            "parent_id": 0,
            "slug": "javascript-jquery",
            "image": "https://w1.pngwing.com/pngs/136/126/png-transparent-javascript-logo-angularjs-nodejs-computer-programming-web-development-computer-software-jquery-yellow.png",
            "publish": 1,
            "created_at": "2019-09-03 12:34:02",
            "updated_at": "2019-09-03 12:34:02",
            "updated_at_formatted": "Tuesday, September 3, 2019"
        }
]

 

# Chú ý: kiểm soát cách định dạng ngày tháng khi các mô hình được tuần tự hóa thành Array hoặc JSON. Ở đây mình đang sử dùng API Resource để trả về một array nên nó sẽ có tác dụng việc format date

Còn nếu mình chỉ hiện thị trong blade bình thường như $category->created_at thì nó không có format nha

Có nghĩa là trả dữ liệu về phía Client(array & json) nó sẽ có định dạng như bên trên


public function index()
{

    $dataCategory =  CategoryResource::collection(Category::all());
    $category = Category::where('parent_id',0)->with('childrenCategories')->get()->toArray();

    //return Response()->json($category);
     // or
    return Response()->json(array("dataCategory"=>$dataCategory,"multiple"=>$category));

}

 

Nếu bạn thấy đem lại kiến thức bổ ích, hãy Click xem quảng cáo trên trang website của mình nhé! 🚀