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

Laravel Custom Eloquent Casts

Laravel Custom Eloquent Casts

Trước đây, chúng ta bị giới hạn cast mặc định do Laravel cung cấp. Mặc dù, có một số gói thư viện có thể  giúp chúng ta custom được nhưng chúng có một nhược điểm lớn. Bởi vì, chúng ghi đề phương thức...

Laravel Socialite Login With Google

Laravel Socialite Login With Google

Google Google là một công cụ tìm kiếm trên internet. Nó sử dụng một thuật toán độc quyền được thiết kế để truy xuất và sắp xếp các kết quả tìm kiếm nhằm cung cấp các nguồn dữ liệu đáng tin cậy và ph...

Laravel Factories, Seeder

Laravel Factories, Seeder

Trong bài viết này, tôi sẽ hướng dẫn các bạn về cách tạo dữ liệu giả trong cơ sở dữ liệu bằng cách sử dụng Laravel Factory và Seed trong Database Seeder. Để tạo model factory, bạn cần chạy lệnh sau...

Laravel Authentication With Laravel UI

Laravel Authentication With Laravel UI

Laravel UI Laravel UI cung cấp một cách nhanh chóng để mở rộng các route và view cần thiết cho chức năng Authentication và bao gồm các cài đặt liên quan cho Bootstrap, React hoặc Vue. Mặc dù nó v...

ZSH-Artisan CLI and Docker: The Perfect Match for Laravel Development

ZSH-Artisan CLI and Docker: The Perfect Match for Laravel Development

Zsh Zsh viết tắt của “ Z Shell ” là một shell nâng cao cho hệ thống Unix và Linux. Nó được phát triển nhằm cung cấp các tính năng và khả năng cao hơn so với shell mặc định trên hầu hết các hệ thố...

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...

Integrating elFinder Into CKEditor 5 In Laravel

Integrating elFinder Into CKEditor 5 In Laravel

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...

Laravel User Authentication

Laravel User Authentication

Trong hướng dẫn này, tôi sẽ hướng dẫn bạn xây dựng chức năng đăng nhập trong Laravel. Công bằng mà nói thì bạn có thể sử dụng Laravel UI hoặc JetStream để tự động tạo ra chức năng đăng nhập trong Lara...

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...

ManhDanBlogs