Eloquent
https://youtu.be/IBUXXErAtuk
DBのテーブルは、それぞれ対応するModelを持つ
ユーザはモデルをつかってテーブルに格納されているデータを操作する(クエリを投げる)
利用できるクエリ
コードを読む
作成する
php artisan make:model Foo
ドキュメントを読んだときの細いメモ_φ(・_・
複数のレコードを帰す場合には殆どの場合Illuminate\Database\Eloquent\Collectionが返る
Illuminate\Support\Collectionを継承しているのでcollectionのメソッドが使える
pluk()などを使うとIlluminate\Support\Collectionが返る
Collectionの中身の要素はEloquentのオブジェクト
TinkerコマンドでYour\Eloquent::where('id', '>', 1)->take(1)->get()とかやればわかる
ちなみにtakeとかwhereは(chainできているので当然)builderを返す
スコープという概念があり、Modelに制約をかけることができる
論理削除(soft delete)が便利
polymorphicなrelationも定義できる
プロパティをIDEで補完できるようにPHPDocをつける
DBのカラムから情報をget/setする時に値を変換したい
Accessor/Mutatorを定義する
$accessored = $model->propertyとしたときにaccessorが呼び出される
$model->property = $valueとしたときにmutatorが呼び出される
デフォルトでcreated_atがCarbonのインスタンス変換されるのは裏でこの仕組が動いているから DBに0/1で格納されている属性値を、取得時にbooleanにキャストしたい
Attribute Castingを使う
DBにJSON型で保存しているものを取得時にarrayにcastしたいときも、このあたりのオプションを使うだけでOK
mutatorと一緒に使うと意図しない挙動になるので、一緒には利用しないこと
この機能はEloquentの基底の抽象クラスが利用しているConcerns\HasAttributesトレイトで実現されている。その実装を見てみよう。
例えばテーブルから値を取得する(getAttribute)の場合、ドキュメントで言うacccessor(コード上ではmutator。getXXXX())があった場合にそれが実行される。もしなければ、castingがあった場合にそれが実行される ページネーションがしたい
キャッシング
開発環境でEloquentを書いたけどうまく動くのかサクッと試したい
実際に使ってハマったことを書いていく
時刻はどうなる?
DBにはUTCで入る
Eloquentを通して取得する際に指定した時刻の補正になる(Asia/Tokyoなら+9:00される)
当然、DBがないとひけないので事前にmigrationする必要がある
/icons/empty.icon $dateFormatでフォーマットが決められるとドキュメントに書いてあるけど、U以外に何が指定できるの?
内部でCarbonのcreateFormatFromにわたされる $dateFormat = \Datetime::ISO8601とか
変換を請け負うコードはこのあたり
MySQLを使う場合、ISO8601には対応していないので$dateFormatは何も指定しないでよい
/icons/empty.icon If your primary key is not an integer, you should set the protected $keyType property on your model to string.
primary keyがBIGINTのときはstringで指定しないといけない?そのままでいい?
castとaccessor/mutatorを組み合わせたときの挙動
mass assignmentの例外が発生する
fillableかguradを指定する必要がある
意図せず書き換えられないような仕様になっている
設計