Posted at

【Laravel】DBから取得した値を$castsで型変換する【Attribute Casting】

More than 1 year has passed since last update.

Laravelの$query->first()でDBの値を取得すると、DBのカラムの型がIntegerで定義していたとしても、返り値はすべてStringになります。

自分は今回、取得した値をさらに他の計算に使いたかったため、自動的にIntegerに変換してくれる処理を調べていました。

すると、LaravelのEloquentには、このために使用されるAttribute Casting(属性キャスト)という機能が備わっているそうです。

モデルの$castsプロパティにカラム名と変換したい型を指定すると、データアクセス時に型変換をしてくれます。

class Article extends Model

{
protected $casts = [
'pv' => 'integer'
];

// $article = Article::first();
// $article->pv がStringではなくIntegerに!

$castsで指定できる属性は、下記のLaravelのソースコードを見ると、[int, integer, real, float, double, string, bool, boolean, object, array, json, collection, date, datetime]に対応してるみたいです。

https://github.com/laravel/framework/blob/5.1/src/Illuminate/Database/Eloquent/Model.php#L2776

        switch ($this->getCastType($key)) {

case 'int':
case 'integer':
return (int) $value;
case 'real':
case 'float':
case 'double':
return (float) $value;
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':
case 'datetime':
return $this->asDateTime($value);
default:
return $value;

参考記事

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

http://nextat.co.jp/staff/archives/140