Trong bài viết này, tôi sẽ hướng dẫn các bạn cách để format các Eloquent Attributes bằng cách sử dụng tính năng Laravel Accessors and Mutators.

Accessors được sử dụng để format các thuộc tính khi chúng ta truy vấn dữ liệu từ database. Trong khi đó, Mutators được sử dụng để format các thuộc tính trước khi lưu chúng vào database.

Sau đây, tôi sẽ hướng dẫn các bạn một ví dụ đơn giản để bạn hiểu rõ hơn về Laravel Accessors and Mutators.

Accessors 

Cho phép các developer có thể tạo ra một thuộc tính giả, mà chúng ta có thể truy cập như thể thuộc tính đó là một cột trong database của chúng ta.

Ví dụ, nếu database của bạn có bảng users, có 2 cột là first_name và last_name và bạn muốn hiển thị tên đầy đủ (full_name) gồm first_name và last_name thì nó sẽ như thế nào?

Nhiều bạn sẽ nghĩ đơn giản và thực hiện nó như sau:

{{ $user->first_name . " " . $user->last_name}}

Nếu bạn sử dụng cách trên ở nhiều nơi, chẳng may khách hàng muốn hiển thị last_name trước và first_name sau, bạn phải tìm lại tất chỗ hiển tên đầy đủ (full_name) và sửa lại như sau:

{{ $user->last_name . " " . $user->first_name}}

Thông qua một tình huống đơn giản trên, chúng ta thấy được sẽ rất mất thời gian để sửa lại mã nguồn rồi phải không. Bây giờ chúng ta hãy sử dụng Laravel Accessors thì sẽ như thế nào.

Cú pháp Accessors:

public function get{Attribute}Attribute()
{
    //
}

Ví dụ:

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class User extends Model
{
    use HasFactory;
    /**
     * Get the user's full name.
     *
     * @return string
     */
    public function getFullNameAttribute()
    {
      return $this->first_name .  " "  . $this->last_name;
    }
}

Sau đó, bạn có thể hiển thị tên đầy đủ (full_name) với Accessors như sau:

{{ $user->full_name }}

Khi khách hàng thay đổi, bạn chỉ sửa ở hàm getFullNameAttribute() thôi. Như vậy, bạn đã thấy chúng ta đã tiết kiệm được rất nhiều thời gian rồi phải không?

Mutator

Cho phép các developer có thể set giá trị thuộc tính trước khi lưu chúng xuống database.

Giả sử, bạn muốn người dùng có thể nhập giá trị first_name tùy ý (có thể là chữ thường hoặc chữ in hoa), nhưng khi lưu xuống database tất cả các ký tự phải chuyển thành ký tự thường hết chẳng hạn.

Nhiều bạn nghĩ đơn giản và thực hiện nó như sau:

use App\Models\User;

$user= User::find(1);

$user->first_name = strtolower('ManhDanBlogs');

Nếu bạn sử dụng cách trên và thực hiện ở nhiều nói trong mã nguồn, chẳng may khách hàng yêu cầu lưu xuống database tất cả các ký tự thành chữ in hoa, bạn phải tìm lại những chỗ xử lý như trên và thay đổi như sau:

use App\Models\User;

$user= User::find(1);

$user->first_name = strtoupper('ManhDanBlogs');

Thông qua một tình huống đơn giản trên, chúng ta thấy được sẽ rất mất thời gian để sửa lại mã nguồn rồi phải không. Bây giờ chúng ta hãy sử dụng Laravel Mutator thì sẽ như thế nào.

Cú pháp Mutator:

public function set{Attribute}Attribute()
{
    //
}

Ví dụ:

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class User extends Model
{
    use HasFactory;
    /**
     * Set the user's first name.
     *
     * @param  string  $value
     * @return void
     */
    public function setFirstNameAttribute($value)
    {
        $this->attributes['first_name'] = strtolower($value);
    }
}

Bây giờ, chúng ta có thể sử dụng điều này trong controller như sau:

use App\Models\User;

$user= User::find(1);

$user->first_name= 'ManhDanBlogs';

Khi khách hàng thay đổi, bạn chỉ sửa ở hàm setFirstNameAttribute() thôi. Như vậy, bạn đã thấy chúng ta đã tiết kiệm được rất nhiều thời gian rồi phải không?

Như vậy, chúng ta đã thực hiện xong một ví dụ đơn giản về Laravel Accessor and Mutator, tôi hy vọng hướng dẫn của tôi sẽ giúp ích cho công việc của bạn. Nếu bạn có bất kỳ câu hỏi nào hãy liên hệ với chúng tôi qua trang contact. Cảm ơn bạn.

CÓ THỂ BẠN QUAN TÂM

How To Optimize Your Site With GZIP Compression

How To Optimize Your Site With GZIP Compression

GZIP là công nghệ nén thường được sử dụng để truyền dữ liệu một cách nhanh chóng qua Insternet. Hiện nay, GZIP là một tiêu chuẩn để nén các file trên trang web, đa số các website hiện nay hơn 99% sử d...

Laravel Middlewares

Laravel Middlewares

Middleware cung cấp một cơ chế thuận tiện để lọc các yêu cầu HTTP gửi đến ứng dụng bạn. Nó là một lớp trung gian nằm giữa request và controller. Bạn có thể thêm các xử lý logic trước khi gửi đến contr...

Encrypted HTTP Live Streaming with Laravel FFMpeg

Encrypted HTTP Live Streaming with Laravel FFMpeg

HTTP Live Streaming (HLS)  HTTP Live Streaming (HLS) là một trong những giao thức phát trực tuyến video được sử dụng rộng rãi nhất . Mặc dù nó được gọi là HTTP "live" streaming, nhưng nó được sử dụn...

Laravel Has Many Through Eloquent Relationship

Laravel Has Many Through Eloquent Relationship

Has Many Through Relationship hơi phức tạp để hiểu một cách đơn giản, nó sẽ cung cấp cho chúng ta một con đường tắt để có thể truy cập dữ liệu của một quan hệ xa xôi thông qua một mối quan hệ trung gi...

Laravel UI Password Reset Expired

Laravel UI Password Reset Expired

Trong thư viện laravel/ui, thì chức năng password reset dù cho token có hết hạn thì vẫn có truy cập vào trang password reset, đến khi bạn submit form thì mới thông báo là token đã hết hạn. Nhưng có mộ...

Laravel Migration

Laravel Migration

Migration cho phép các nhà phát triển (Developer) nhanh chóng tạo ra cở sở dữ liệu của ứng dụng mà không cần vào màn hình quản lý cơ sở dữ liệu hay chạy bất kì một câu lệnh SQL nào. Trước hết, nếu...

Integrating CKFinder into CKEditor 5 in Laravel 11

Integrating CKFinder into CKEditor 5 in Laravel 11

CKEditor 5 CKEditor 5 là một trình soạn thảo văn bản phong phú JavaScript với nhiều tính năng và khả năng tùy chỉnh. CKEditor 5 có kiến trúc MVC hiện đại, mô hình dữ liệu tùy chỉnh và DOM ảo, mang...

Csv import with Validation for Laravel

Csv import with Validation for Laravel

Trong một bài viết lúc trước, mình đã chia sẻ đến các bạn cách xây dựng một service import và export CSV sử dụng Facades, nếu có bạn nào không biết hoặc đã quên các bạn có thể tham khảo lại bài viết t...

Generate PDF with Header and Footer on every page in Laravel

Generate PDF with Header and Footer on every page in Laravel

Hôm nay, trong bài viết này mình sẽ chia sẻ với các bạn cách dompdf mà header và footer sẽ được hiển thị ở tất cả các trang. Đây cũng là một vấn đề khá phổ biến, khi chúng ta phát triển các tính năng...

ManhDanBlogs