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 Many to Many Polymorphic Relationship

Laravel Many to Many Polymorphic Relationship

Many to many Polymorphic Relationship cũng hơi phức tạp để hiểu. Ví dụ: nếu bạn có bài post, video và tag, bạn cần kết nối với nhau theo yêu cầu là mọi bài đăng đều có nhiều tag và video cũng như vậy....

Implementing Private User Folders with elFinder in Laravel

Implementing Private User Folders with elFinder in Laravel

elFinder elFinder là một trình quản lý tập tin mã nguồn mở dành cho web, được viết bằng JavaScript sử dụng jQuery UI. elFinder được phát triển dựa trên cảm hứng từ sự tiện lợi và đơn giản của chư...

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

Cloudflare's Turnstile CAPTCHA in Laravel

Cloudflare's Turnstile CAPTCHA in Laravel

Ngày 28/09/2022, Cloudflare đã thông báo về phiên bản beta mở của Turnstile, một giải pháp thay thế vô hình cho CAPTCHA. Bất kỳ ai, ở bất kỳ đâu trên Internet muốn thay thế CAPTCHA trên trang web c...

Laravel CKEditor 5 Image Upload

Laravel CKEditor 5 Image Upload

CKEditor 5CKEditor 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 Facades

Laravel Facades

Facade là gì? Chúng ta có thể hiểu Facade là mặt tiền và mặt trước của một tòa nhà hay bất cứ thứ gì. Tầm quan trọng của Facade là chúng có thể dễ nhận thấy và nổi bật hơn, tương tự như vậy, thì...

Integrating TinyMCE in Laravel 10 using Vite

Integrating TinyMCE in Laravel 10 using Vite

TinyMCE TinyMCE là một trình soạn thảo WYSIWYG được xây dựng trên nền tảng Javascript, được phát triển dưới dạng mã nguồn mở theo giấy phép MIT bởi Tiny Technologies Inc. TinyMCE cho phép ngư...

Laravel Socialite Login With Gitlab

Laravel Socialite Login With Gitlab

GitLab GitLab là kho lưu trữ Git dựa trên web cung cấp các kho lưu trữ mở và riêng tư miễn phí, các khả năng theo dõi vấn đề và wiki. Đây là một nền tảng DevOps hoàn chỉnh cho phép các chuyên gia...

Google Drive as Filesystem in Laravel

Google Drive as Filesystem in Laravel

Đối với một số dự án, bạn cần phải sử dụng Google Drive (với tài khoản @gmail.com cá nhân hoặc tài khoản G Suite) làm nhà cung cấp bộ nhớ trong các dự án Laravel. Trong bài đăng này, tôi sẽ hướng d...

ManhDanBlogs