BookmarkLINELaravelのEloquentには「アクセサ」と「ミューテタ」というものがあります。これらを使うと、EloquentORM、つまりはモデルでのデータ操作を行う際に、予めデータの形式を定義しておく事が出来ます。今回はLaravelのアクセサとミューテタを用いてEloquentの属性フォーマットを定義していきます。今回の開発環境は以下の通りです。5.8Laravelプロジェクトのルートディレクトリを「laravel/」としています。データ取得結果については、確認しやすいように適宜変換しています。アクセサアクセサの定義を行うと、予め取得するカラムのフォーマットを定義できます。苗字(first_name)と名前(last_name)を収録したカラムがあるとして、これらについてアクセサを定義します。アクセサの定義は、モデルクラスに行います。}}これで何を定義しているのかというと、first_nameカラムとlast_nameカラムへアクセスした際に取得できる「値のフォーマット」を定義しています。メソッド名には規則があり、get[カラム名(パスカルケース)]Attributeという命名規則になっています。first_nameカラムへの定義の場合はgetFirstNameAttribute()のようになります。メソッドを定義していますが、これは英字に対して頭文字を大文字に変換するものです。ちなみに今回用いるサンプルのデータベースには英字の名前が全て小文字で収録されており、この定義の場合は、first_name・last_name共に、頭文字が大文字になった状態で取得できるという事になります。|+----+------------+-----------+コントローラから取得します。}}上記の通り、モデルにアクセサを定義しておく事で、定義した通りのフォーマットで取得できるようになります。既存のカラムを用いて、オリジナルの値を定義する事もできます。}}first_nameカラムとlast_nameカラムの値を合わせて、full_nameを作成しています。テーブルにはfull_nameというカラムは存在していませんが、これで$this->full_nameとしてアクセスできるようになります。コントローラから取得します。Rohan//)あたかもfull_nameカラムが存在しているかのように取得が行えました。ちなみに前半で定義した頭文字を大文字にするアクセサをそのまま定義しておくとそれも適用されます。ミューテタミューテタはアクセサの逆のようなものです。アクセサでは取得の際の定義を行いましたが、ミューテタは値を代入する際のフォーマットを定義します。今回のサンプルデータベースには英字の名前が収録されていますが、新たなレコードを挿入する際もやはりもれなく小文字で収録したいです。そこで、モデルクラスにてミューテタを定義します。strtolower($value);}アクセサはgetプレフィックスだったのに対して、ミューテタはsetプレフィックスです。命名規則はアクセサと同じです。ここでは、strtolower()メソッドを用いて、全てを小文字にしています。コントローラから値をセットし、保存してみます。'Swift';$member->save();保存結果を見てみます。|+----+------------+-----------+セット時には頭文字を大文字で代入しましたが、保存時にはミューテタの定義通り、小文字で保存されている事が確認できます。日付ミューテタLaravelでは、created_at(作成日)カラムとupdated_at(更新日)カラムに対して、Eloquentでの取得の際に自動的にCarbonオブジェクトにて返却されます。Carbonは日時を操作するPHPのパッケージで、PHPのDateTimeクラスを継承しています。DateTime.https://carbon.nesbot.com/このCarbonインスタンスを用いて入力時の日時フォーマットを定義できます。created_atとupdated_at以外でCarbonオブジェクトとして扱いたいカラムがある場合は、モデルクラスに追加します。];取得時の違いは以下のようになります。UTCCarbonオブジェクトなので、形式を自在に形を変化させる事も可能です。10時間後デフォルトの日付フォーマットcreated_at/updated_at並びにモデルで$datesとして指定したカラムについて、その時に挿入する日時のフォーマットを変更する事が出来ます。それを変更したい場合は以下のようにモデルに設定します。任意のフォーマットを設定します。ちなみに上記はUnixTimestampの設定です。この場合はカラムを数値型にする必要があります。変更$table->integer('updated_at');$table->integer('created_at');値をセットし、保存します。now();$member->save();結果は以下になります。Timestampで登録できている事が確認できました。次は、DATEフォーマットで試してみます。日時フォーマットをDATEとする日時カラムをdate型で作成するので、マイグレーションを以下へ変更します。$table->date('added_on');$table->date('updated_at');$table->date('created_at');コントローラなどで値をセットし、保存します。記述は先ほどと同じです。結果は以下になります。|+----+------------+-----------+------------+------------+------------+date型で登録できている事が確認できました。設定する事で、任意のカラムに対して属性のキャストを行う事が出来ます。ここで言う「キャスト」とは、データ取得の際にそのカラムのフォーマットを変更する事です。datetime型のカラムをdate型としてここに設定すれば、データ取得時にdate型で受け取る事が出来ます。];上記の場合は、datetime型のadded_onカラムに対してdate型で取得するようにキャストしています。取得してみると結果は以下のようになります。UTC//)時間の部分が丸まっているのが確認できます。このようにして、$castsプロパティでは以下へのキャストを行う事が出来ます。(変更するカラムに対してキャスト可能な型を指定)integerrealfloatdoublestringbooleanobjectarraycollectiondatedatetimetimestamp上記のリストを見てなんとなく気が付いたかもしれませんが、キャストはただカラムからの取得フォーマットを変えるだけではなく、オブジェクトやコレクション、配列と言った形にもキャストできます。まとめミューテタやアクセサを上手く使いこなすとロジックの中で値を変換しなくて済むのでソースコードも綺麗になります。手間も省けるので是非試してみてください。SESを使ってAPIメール送信を行う(Mailableクラス&SimpleEmailService)2019.12.3MySQL8.0.16で追加されたCHECK制約を試してみる。RitoLaboこのサイトについて利用規約プライバシーポリシ。