CodeStar Academy
  • Trang chủ
  • Khóa học
  • Lịch khai giảng
  • Blog
  • Liên hệ
  • Trang chủ
  • Khóa học
  • Lịch khai giảng
  • Blog
  • Liên hệ

Eloquent ORM: Accessors và Mutator

  • Tháng Một 5, 2021
  • Posted by: Le Thi Bich Ha
  • Category: Uncategorized
Không có phản hồi
Eloquent ORM: Accessors và Mutator

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

học lập trình online học lập trình web học lập trình web online học php cơ bản khóa học front end khóa học html css khóa học lập trình web khoa hoc lap trinh web

Trả lời Hủy

Về chúng tôi

CodeStar hướng đến việc mang lại những trải nghiệm mới cho Học viên trong mỗi buổi học thông qua việc tham gia vào các dự án tại CodeStar

Địa chỉ

Tầng 4, Tòa CT1, Bắc Hà C14, Tố Hữu, Trung Văn, Nam Từ Liêm, Hà Nội.

0367833933

[email protected]

Quick Links

Khóa học

Lịch khai giảng

Kênh Youtube

Liên hệ


Copyright © 2020. CodeStar

Search