コンテンツにスキップするには Enter キーを押してください

Laravel オブジェクトのキャスト(Attribute Casting) + カスタマイズ方法

Laravel オブジェクトのキャスト

(Attribute Casting) + カスタマイズ方法

Laravelで行うオブジェクトのキャスト(Attribute Casting)の方法をまとめます。

バージョン
  • laravel 5.7
CakePHP3でいうと

CakePHP3の言葉でいうと、「Type」の機能になります。

公式ドキュメントの記載場所

https://laravel.com/docs/5.7/eloquent-mutators#attribute-casting

デフォルトで対応している型

下記のコードを読むとわかる

Illuminate\Database\Eloquent\Concerns\HasAttributes::castAttribute()

        switch ($this->getCastType($key)) {
            case 'int':
            case 'integer':
                return (int) $value;
            case 'real':
            case 'float':
            case 'double':
                return $this->fromFloat($value);
            case 'decimal':
                return $this->asDecimal($value, explode(':', $this->getCasts()[$key], 2)[1]);
            case 'string':
                return (string) $value;
            case 'bool':
            case 'boolean':
                return (bool) $value;
            case 'object':
                return $this->fromJson($value, true);
            case 'array':
            case 'json':
                return $this->fromJson($value);
            case 'collection':
                return new BaseCollection($this->fromJson($value));
            case 'date':
                return $this->asDate($value);
            case 'datetime':
            case 'custom_datetime':
                return $this->asDateTime($value);
            case 'timestamp':
                return $this->asTimestamp($value);
            default:
                return $value;
        }

型の設定方法

公式ドキュメントの記載

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class User extends Model
{
    /**
     * The attributes that should be cast to native types.
     *
     * @var array
     */
    protected $casts = [
        'is_admin' => 'boolean',
    ];
}

カスタマイズ方法

参考」を元に記載

  1. castAttribute()を拡張

例) 金額関係のAttribute Castingを行う方法

    protected function castAttribute($key, $value)
    {
        if (isset($this->casts[$key]) && $this->casts[$key] == 'money') {
            return number_format($value);
        }

        return parent::castAttribute($key, $value);
    }

    protected $casts = [
        'price' => 'money',
    ];

コメントする

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です