Eloquent ORM: Accessors và Mutator
- Tháng Một 5, 2021
- Posted by: Le Thi Bich Ha
- Category: Uncategorized
Tiếp tục chuỗi bài viết về Eloquent ORM cơ bản. Trong bài viết này mình xin giới thiệu về 1 phần rất hữu dụng và hay được sử dụng trong các dự án đó là Mutators và Accessors. Mutators và Accessors giúp ích cho việc convert 1 attributes. Khi lấy nó từ model ra hoặc cũng có thể là set giá trị cho attributes trước khi lưu vào database.
Một ví dụ thực tế để dễ hiểu hơn là: Bạn có 1 bảng User với 2 column là first_name và last_name, ở 1 số màn hình yêu cầu bạn nối 2 giá trị này lại rồi mới hiển thị ra. Cách thông thường là sử dụng nối chuỗi user->first_name . “” . user->last_name, bất cứ chỗ nào cần thì ta đều phải viết như này. Khá là bất tiện đúng ko nào?
Accessors sẽ giúp bạn cải thiện điều này, chúng ta sẽ cùng đi tìm hiểu ở phần dưới nhé!
Accessors
Trước khi đi ngay vào giải quyết vấn đề trên, chúng ta cùng đi vào 1 ví dụ đơn giản hơn đó là convert trường first_name viết in hoa chữ đầu. Ở đây chúng ta sẽ cần khai báo 1 accessors cho first_name:
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class User extends Model
{
/**
* Get the user's first name.
*
* @param string $value
* @return string
*/
public function getFirstNameAttribute($value)
{
return ucfirst($value);
}
}
Model sẽ tự động chạy accessor này khi bạn lấy giá trị của first_name. vì vậy mà attributes sẽ được convert. Tiện hơn rất nhiều việc cứ phải gọi hàm ucfirst() đúng ko nào!
Về cách khai báo 1 accessor, tên hàm được đặt theo quy tắc getFooNameAttribute, Foo ở đây sẽ là tên column.
VD: column name thì là getNameAttribute, school_name thì là getSchoolNameAttribute…
Quay lại với vấn đề lúc đầu, giờ ta phải ghép giá trị 2 column lại với nhau thì làm như thế nào! Việc này cũng rất đơn giản, vẫn theo quy tắc trên nhưng giờ ta định nghĩa accessors là full_name:
public function getFullNameAttribute()
{
return $this->attribute['fist_name ']. ' ' . $this->attribute['last_name'];
}
Nhưng chú ý, vì ban đầu ko hề có trường full_name trong cơ sở dữ liệu, vì thế ngoài việc khai báo trên, ta cần khai thêm full_name vào trong $append của Model:
class User extends Model
{
/**
* The accessors to append to the model's array form.
*
* @var array
*/
protected $appends = ['full_name'];
...
Sau đó chúng ta có thể lấy giá trị này bất cứ lúc nào:
$user = App\User::find(1);
$fullName = $user->full_name;
Mutators
Ngược lại với Accessors 1 tí, nếu accessors là lấy ra giá trị của attributes rồi thay đổi. Thì ở mutators lại là sẽ là nhận vào giá trị ta set, thay đổi nó rồi gán lại cho attributes.
Một ví dụ cụ thể là khai báo mutators cho trường password:
public function setPasswordAttribute($value)
{
$this->attributes['password'] = Hash::make($value);
}
Và giờ chúng ta có thể thỏa mái set giá trị cho password, giá trị của nó khi lưu vào db sẽ được mã hóa để bảo mật hơn.
Tác giả: Nguyễn Bảo Trung