なぜModelの$castsで型を定義する必要があるのか
データベースから取得してきたデータの型を、$castsで定義した型に変換することが可能です。
ケースによりますが、データベースから取得してきた型を変換する必要がある場合があります。
例を挙げて、解説します。
データベースにboolean型でカラムをセットした場合
Laravelではマイグレーションを使用してテーブル作成をします。
今回は例としてmembersテーブル作成時にflagカラムに真偽値を登録します。
真偽値のため型をboolean型でセットしてみます。
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreateMembersTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('members', function (Blueprint $table) {
$table->id();
$table->string('name')->comment('名前');
$table->string('address')->comment('住所');
$table->string('tel')->comment('電話番号');
$table->boolean('flag')->comment('真偽値');
$table->timestamps();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('members');
}
}
しかし、boolean型はtrueやfalseの真偽値を直接保持できるわけではありません。
Laravelでカラムの型をbooloan型で設定した場合、mysqlではデータ型はtinyint(1)になります。
そのため、trueの場合は1、falseの場合は0で登録する必要があります。
この場合、データを取得時は1または0のint型を取得するので、trueまたはfalseでデータを取得したい場合は$castsで型変換する必要が出てきます。
$castsの書き方
モデルの中に$castsを配列で定義します。
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class Member extends Model
{
use HasFactory;
protected $guarded = [
'id',
];
protected $casts = [
'name' => 'string',
'flag' => 'boolean'
];
}
$castsの型一覧
型一覧
- array
- AsStringable::class
- boolean
- collection
- date
- datetime
- immutable_date
- immutable_datetime
- decimal:<digits>
- double
- encrypted
- encrypted:array
- encrypted:collection
- encrypted:object
- float
- integer
- object
- real
- string
- timestamp
コメント