Accessors và Mutators trong Laravel

Xin chào tất cả anh em, như tiêu đề hôm nay mình sẽ giới thiệu cho mọi người về một phần rất hữu dụng và thường được sử dụng trong Laravel Eloquent, bắt đầu luôn nhé.

  • Accessors và Mutators là gì? Tại sao nên sử dụng

Accessors và Mutators cho phép anh em convert data khi nó được lấy ra từ Model và set data trước khi nó được lưu vào database.

Đọc đến đây nhiều anh em sẽ nghĩ thế thì cần gì phải dùng đến 2 cái này, đúng là có nhiều cách để có thể get và set data nhưng Accessors và Mutators có thể làm điều này 1 cách tự động mà không cần phải gọi lại nhiều lần.

  • Accesors

Accessors cho phép anh em convert lại data trước khi lấy ra khỏi model.

VD: Để có full_name từ first_name và last_name trong model User, ta sẽ thêm function sau vào model

Mỗi khi get data từ Model mặc định field “full_name” với giá trị được ghép từ “first_name” và “last_name” sẽ được thêm vào 1 cách tự động

Anh em sẽ thắc mắc tại sao tên field lại là “full_name”, nếu để ý thì tên funcion chính là cú pháp của nó: get + {Tên field ở dạng Camel Case} + Attribute

Chú ý vì field “full_name” không có trong model thì cần khai báo thêm như sau:

Vậy nếu chúng ta cần format data trong Model thì sao?

VD: Mặc định datetime của “created_at” lưu trong DB sẽ là Y-m-d H:i:s nếu chúng ta cần convert nó về d/m/Y H:i:s

  • Mutators

Ngược lại với Accessors thì chúng ta có người anh em Mutators, Mutators cho phép convert data trước khi nó được lưu vào database

VD: Ta cần set first_name và last_name của user về dạng lower case trước khi lưu vào DB

cú pháp ở đây là: set + {tên field dạng Camel Case} + Attribute

Chú ý trước khi sử dụng: Khi anh em định nghĩa Accessors và Mutators thì nó sẽ mặc định luôn gọi mỗi khi anh em get hoặc save data nên hãy sử dụng sao cho hợp lý nhé

Hi vọng bài viết có thể giúp ích anh em ít nhiều! Nếu cần thông tin đầy đủ hơn, xem tại đây:

https://laravel.com/docs/8.x/eloquent-mutators

Related Posts

2 Comments

Leave a Reply

Your email address will not be published. Required fields are marked *