Eloquent: Mutators trong laravel là gì

21.09.2020

5.0/5 (1 Reviews)

Lần trước ta đã tìm hiểu giới thiệu về relationships trong Laravel. Hôm nay chúng ta cùng với các bạn tìm hiểu về Mutators để áp dụng vào trong thiết kế website nhé!

    Lần trước ta đã tìm hiểu giới thiệu về relationships trong Laravel. Hôm nay chúng ta cùng với các bạn tìm hiểu về Mutators để áp dụng vào trong thiết kế website nhé!

    Giới thiệu về Accessors và mutators

    Accessorsmutators cho phép bạn định dạng các giá trị attribute của Eloquent khi bạn lấy lại hoặc set chúng trên các thể hiện của model. Ví dụ, bạn có thể muốn sử dụng Encrypter của Laravel để mã hóa một giá trị khi nó được lưu trong cơ sở dữ liệu, và sau đó tự động gải mã các thuộc tính khi bạn truy cập nó trên 1 Eloquent model.

    Ngoài bộ tùy chỉnh accessors và mutators, Eloquent cũng có thể tự động cast các trường date thành instances hoặc thậm chí.

    Định nghĩa một accessor

    Để định nghĩa 1 accessor, tạo ra 1 phương thức getFooAttribute trên model của bạn với Foo là "studly" tên cased của trường mà bạn muốn truy cập. Trong ví dụ này, chúng ta sẽ định nghĩa 1 accessor cho thuộc tính first_name. Các accessor sẽ tự động được gọi bởi Eloquent khi ta lấy giá trị của thuộc tính 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);
        }
    }
    

    Như bạn có thể thấy, giá trị ban đầu của các cột được thông qua accessor, cho phép bạn thao tác và trả về giá trị. Để truy cập các giá trị của các mutator, bạn có thể chỉ đơn giản là truy cập vào thuộc tính first_name trên 1 model instance.

    $user = App\User::find(1);
    
    $firstName = $user->first_name;
    

    Định nghĩa một Mutator

    Để định nghĩa 1 mutator, định nghĩa 1 phương thức setFooAttribute trong model của bạn với Foo là "studly" tên cased của cột mà bạn muốn truy cập. Vì vậy, một lần nữa, chúng ta hãy xác định 1 mutator cho thuộc tính first_name. Mutator này sẽ được tự động gọi khi chúng ta set giá trị cho thuộc tính first_name trên model.

    <?php
    
    namespace App;
    
    use Illuminate\Database\Eloquent\Model;
    
    class User extends Model
    {
        /**
         * Set the user's first name.
         *
         * @param  string  $value
         * @return void
         */
        public function setFirstNameAttribute($value)
        {
            $this->attributes['first_name'] = strtolower($value);
        }
    }
    

    Các mutator sẽ nhận được những giá trị đang được set trên các thuộc tính, cho phép bạn thao tác với các giá trị và set giá trị trên model nội bộ của Eloquent. Ví dụ, nếu chúng ta muốn set các thuộc tính first_name thành Sally:

    $user = App\User::find(1);
    
    $user->first_name = 'Sally';
    

    Trong ví dụ này, hàm setFirstNameAttribute sẽ được gọi với giá trị Sally. Các mutator sau đó sẽ áp dụng hàm strtolower và set giá trị kết quả của nó trong mảng $attribute nội bộ.

    Date Mutators

    Theo mặc định, Eloquent sẽ chuyển đổi các cột created_atupdated_at thành các instances của Carbon là mở rộng của lớp DateTime trong PHP và cung cấp thêm 1 tập hợp những method hữu ích. Bạn có thể tùy chỉnh date sẽ tự động được biến đổi, và thậm chí hoàn toàn vô hiệu hóa biến đổi này, bằng cách ghi đè các $dates của model của bạn.

    <?php
    
    namespace App;
    
    use Illuminate\Database\Eloquent\Model;
    
    class User extends Model
    {
        /**
         * The attributes that should be mutated to dates.
         *
         * @var array
         */
        protected $dates = [
            'created_at',
            'updated_at',
            'deleted_at'
        ];
    }
    

    Khi một cột được coi là 1 date, bạn có thể set giá trị của nó là 1 UNIX timestamp, date string (Y-m-d), date-time string và dĩ nhiên là DateTime/Carbon instance, và giá trị của date sẽ tự động được lưu trữ đúng cách trong cơ sở dữ liệu của bạn:

    $user = App\User::find(1);
    
    $user->deleted_at = Carbon::now();
    
    $user->save();
    

    Như đã nói ở trên, khi lấy thuộc tính đc liệt kê trong $dates property, nó sẽ tự động được cast vào Carbon instance, cho phép bạn sử dụng bất kỳ phương thức của Carbon nào trong attribute của bạn:

    $user = App\User::find(1);
    
    return $user->deleted_at->getTimestamp();
    

    Date Formats

    Theo mặc định, các timestamps được định dạng như là 'Y-m-d H:i:s'. Nếu bạn cần để tùy chỉnh định dạng timestamp, set $dateFormat property trên model của bạn. Property này xác định cách tính date được lưu trữ trong CSDL, cũng như định dạng của nó khi model được sắp xếp như 1 array hoặc JSON:

    <?php
    
    namespace App;
    
    use Illuminate\Database\Eloquent\Model;
    
    class Flight extends Model
    {
        /**
         * The storage format of the model's date columns.
         *
         * @var string
         */
        protected $dateFormat = 'U';
    }
    

    Attribute Casting là gì

    $casts property trên model của bạn cung cấp 1 phương pháp thuận tiện để chuyển đổi thuộc tính với các loại dữ liệu thương. Các $casts property nên là 1 array mà key là tên của thuộc tính và value là kiểu của column mà bạn muốn cast. Các kiểu mà cast hỗ trợ gồn có: integer, real, float, double, string, boolean, object, array, collection, date, datetimetimestamp.

    Ví dụ, chúng ta hãy cast thuộc tính is_admin, được lưu trữ trong CSDL của chúng ta là integer(0 or 1) thành boolean.

    <?php
    
    namespace App;
    
    use Illuminate\Database\Eloquent\Model;
    
    class User extends Model
    {
        /**
         * The attributes that should be casted to native types.
         *
         * @var array
         */
        protected $casts = [
            'is_admin' => 'boolean',
        ];
    }
    
    

    Bây giờ thuộc tính is_admin sẽ luôn được cast thàn 1 boolean mỗi khi bạn truy cập nó. ngay cả khi các giá trị cơ bản được lưu trữ trong CSDL là 1 integer:

    $user = App\User::find(1);
    
    if ($user->is_admin) {
        //
    }
    
    

    Array & JSON Casting là gì

    Kiểu dữ liệu array đặc biệt hữu ích khi làm việc với các column được lưu trữ như là 1 JSON. Ví dụ, nếu CSDL của bạn có 1 JSON hoặc trường kiểu text có chứa serialized JSON, thêm các array cast thuộc tính đó sẽ tự động tuần tự hóa các thuộc tính cho 1 array PHP khi bạn truy cập nó trên model Eloquent.

    <?php
    
    namespace App;
    
    use Illuminate\Database\Eloquent\Model;
    
    class User extends Model
    {
        /**
         * The attributes that should be casted to native types.
         *
         * @var array
         */
        protected $casts = [
            'options' => 'array',
        ];
    }
    
    

    Khi các cast được định nghĩa, bạn có thể truy cập vào các thuộc tính tùy chọn và nó sẽ tự động chuyển đổi từ JSON thành 1 array PHP. Khi bạn thiết lập giá trị của thuộc tính tùy chọn, các array nhất định sẽ tự động được chuyển đổi lại thành JSON để lưu trữ.

    $user = App\User::find(1);
    
    $options = $user->options;
    
    $options['key'] = 'value';
    
    $user->options = $options;
    
    $user->save();
    
    

     Vậy là mình đã giới thiệu cho các bạn về Mutator trong Eloquent rồi. Hy vọng bài viết này sẽ hữu ích cho các bạn 

    CÓ THỂ BẠN QUAN TÂM

    Bài Viết Cùng Chuyên Mục

    XEM THÊM
    thumbnail

    LPStack Server: Giải pháp thay thế XAMPP và MAMP năm 2026

    10.03.2026

    Bạn đã chán ngấy XAMPP hay MAMP chậm chạp? Khám phá LPStack Server – Môi trường Local Development siêu nhẹ của người Việt với Auto Vhost, Public Tunnel, chuyển đổi PHP 1-click và quản lý Database Native chuyên nghiệp

    thumbnail

    Hướng Dẫn Tạo Trò Chơi Cờ Caro Nâng Cao bằng HTML

    19.03.2025

    Chào các bạn! Trong bài viết này, chúng ta sẽ cùng nhau xây dựng một trò chơi Cờ Caro đơn giản nhưng có nhiều tính năng thú vị như giới hạn nước đi, pháo hoa khi chiến thắng, chọn chế độ chơi và đếm thời gian.

    thumbnail

    Grok AI: Giới thiệu chi tiết về chatbot của Elon Musk

    04.03.2025

    Grok là một chatbot AI tiên tiến, được phát triển bởi xAI, công ty do Elon Musk sáng lập. Ra mắt lần đầu vào tháng 11/2023, Grok được thiết kế để cạnh tranh với các mô hình AI nổi tiếng như ChatGPT

    thumbnail

    Hướng dẫn tạo Livechat trả lời bằng AI Grok của X

    04.03.2025

    Hướng dẫn kỹ thuật tạo Livechat AI bằng HTML, CSS, JavaScript và PHP Dưới đây là hướng dẫn từng bước để xây dựng một ứng dụng livechat AI đơn giản. Chúng ta sẽ có giao diện frontend (HTML, CSS, JS) và backend (PHP) xử lý tin nhắn.

    thumbnail

    Temu Affiliate là gì? Cách kiếm tiền với Temu mới nhất 2024

    23.10.2024

    Temu Affiliate là một chương trình tiếp thị liên kết mới mẻ được đưa ra bởi sàn thương mại điện tử Temu. Tham gia ⭐️ Chương trình tiếp thị liên kết Temu⭐️! Lên đến ????₫2.500.000.000 mỗi tháng