Quay lại
Accessors và Mutators trong Laravel

Accessors và mutators cho phép bạn định dạng các giá trị thuộc tính Eloquent khi bạn truy xuất hoặc đặt chúng vào các model instances. Mình sẽ giải thích cách bạn có thể sử dụng chúng vào ứng dụng của mình. Let go !!!

Accessors

Sẽ có lúc chúng ta cần tìm nạp một số trường cơ sở dữ liệu với một số sửa đổi mà không thực hiện thay đổi sau khi xử lý truy vấn.

Mình có một ví dụ như này: Mình có một trường có kiểu là DateTime có tên trường là reporting_date trong bảng của inventory. Và bây giờ, trong khi tìm nạp các bản ghi từ bảng cụ thể này, mình chỉ muốn ngày, tháng, năm từ trường cụ thể này và loại bỏ thời gian.

Quy trình thông thường để làm được điều này sẽ lấy tất cả các bản ghi, chạy vòng lặp for trên chúng và áp dụng logic cần thiết trên trường reporting_date . Đây là một cách rườm rà.

Trong Laravel, để làm được điều này, chúng ta có các Accessors mà bạn có thể định nghĩa trong model của bảng.

Vì vậy, đối với trường hợp của chúng ta, chúng ta có thể xác định một accessor cho trường reporting_date như bên dưới đây:

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;
class Inventory extends Model
{
    /**
     * The table associated with the model.
     *
     * @var string
     */
    protected $table = 'inventory';

    public function getReportingDateAttribute($value)
    {
        $createDate = new \DateTime($value); //2017-08-14 20:58:37
        return $createDate->format('Y-m-d');
    }
}

Như bạn có thể thấy, mình đã định nghĩa một hàm getReportingDateAttribute() trong model Inventory trong đó ReportingDate là tên viết tắt của cột reporting_date mà chúng ta muốn truy cập. Mình đã viết logic để chỉ truy xuất ngày từ trường DateTime.

Tại đây, giá trị ban đầu của cột được chuyển đến accessor, cho phép bạn thao tác và trả về giá trị. Để truy cập giá trị của accessor, bạn có thể chỉ cần truy cập thuộc tính reporting_date trên một model instance:

<?php
$inventory = App\Inventory::find(5);

$reportingDate = $inventory->reporting_date; //2017-08-14

Mutators

Tương tự như Accessor, Mutator có thể được sử dụng để sửa đổi giá trị của trường cụ thể trước khi lưu nó vào cơ sở dữ liệu mỗi khi một truy vấn insert hoặc update được thực thi.

Ví dụ: nếu mình muốn lưu trường tax của bảng orders trước khi lưu vào cơ sở dữ liệu với một số tính toán, mình sẽ xác định Mutator các bạn có thể xem ví dụ như bên dưới:

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;
class Order extends Model
{
    /**
     * The table associated with the model.
     *
     * @var string
     */
    protected $table = 'orders';

    public function setTaxAttribute($value)
    {
        $tax = ($tax * 20)/100;
        $this->attributes['tax'] = tax;
    }
}

Tại đây, Mutator sẽ nhận giá trị đang được đặt trong thuộc tính, cho phép bạn thao tác giá trị và đặt giá trị được thao tác trong thuộc tính $attributes bên trong của mô hình Eloquent. Vì vậy, ví dụ: nếu chúng ta cố gắng đặt thuộc tính tax thành 15:

<?php
$order = App\Order::find(10);

$order->tax = 15;

Trong ví dụ này, hàm setTaxAttribute() sẽ được gọi với giá trị 15. Mutator sau đó sẽ áp dụng các tính toán cần thiết về thuế và đặt giá trị kết quả của nó trong mảng $attributes bên trong.

 Kết luận

Accessors và Mutators là những chức năng thực sự tuyệt vời do Laravel cung cấp để lấy và thiết lập các thuộc tính của model nếu được sử dụng thành thạo. Nó cũng có thể nâng cao hiệu suất của ứng dụng khi chúng xử lý các giá trị model ở cấp độ cơ sở dữ liệu.

Hy vọng bạn thích bài viết này.

 

Bình luận (0)

Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough

Bài viết liên quan

Learning English Everyday