[Laravel5][Eloquent] Attribute Castingによりデータ型を厳密に取り扱う
Eloquentのスキーマビルダーで真偽値(boolean)のカラムを作成した場合、 たとえばMySQLではtinyIntとして0か1で保存されます。
0と1をそのまま使っていても、真偽値として評価される際に暗黙的にデータ型のキャストが行われるので、問題にはなることは少ないかもしれません。
ですが、モデルのプロパティにアクセスした際にデータが真偽値であると保証されていれば、 データベースの実装の詳細を気にせず、より安心してコードを書くことができます。無用なバグも減るでしょう。
EloquentにはこのためのAttribute Casting(属性キャスト)という機能が実装されており、$castsプロパティにカラム名とデータ型の連想配列として設定することで、プロパティへのアクセス時にデータ型の変換を行えます。
モデルの定義
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Article extends Model
{
protected $casts = [
'is_published' => 'boolean'
];
}
$article = Article::first();
if($article->is_published) {
//
}
サポートされているのはbooleanのほかに、integer、real、float、double、string、object、array、collection、date、datetimeです。
個人的には配列をシリアライズしてカラムに保存するためにこの機能をよく使います。 もちろん、レコードの検索に利用しないようなパラメータ限定ですが。
日付のキャスト
日付のキャストは少々特別扱いされています。
デフォルトでcreated_atとupdated_atが\Carbon\Carbonのインスタンスにキャストされるのと同様に、$datesプロパティに登録したカラムもCarbonのインスタンスにキャストされます。
モデルの定義
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Article extends Model
{
$protected $dates = [
'created_at',
'updated_at',
'published_at',
];
}
$article = Article::first();
//フォーマットして出力
echo $article->published_at->format('Y-m-d H:i:s');
//30日後の日時を設定して保存
$article->published_at = Carbon::now()->addDays(30);
$article->save();
一度Carbonに慣れると手放せないですね。