Eloquent
https://youtu.be/IBUXXErAtuk
Eloquent: Getting Started - Laravel - The PHP Framework For Web Artisans(和訳)
LaravelのORM
Active Recordの実装
DBのテーブルは、それぞれ対応するModelを持つ
ユーザはモデルをつかってテーブルに格納されているデータを操作する(クエリを投げる)
利用できるクエリ
Query builderのものが利用できる。多分内部で利用している
コードを読む
【Laravel】 第1回 Eloquent ソースコードリーディング - モデルの取得 - Qiita
作成する
php artisan make:model Foo
https://laravel.com/docs/6.x/eloquent#defining-models
ドキュメントを読んだときの細いメモ_φ(・_・
複数のレコードを帰す場合には殆どの場合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を返す
参考:Eloquent: Collections - Laravel - The PHP Framework For Web Artisans
スコープという概念があり、Modelに制約をかけることができる
論理削除(soft delete)が便利
relationshipを定義する(外部キー制約で表現)
Eloquent:リレーション 5.7 Laravel
polymorphicなrelationも定義できる
Eloquent: Relationships - Laravel - The PHP Framework For Web Artisans
プロパティをIDEで補完できるようにPHPDocをつける
laravel-ide-helper#5c24f02e3f44250000d5347a
DBのカラムから情報をget/setする時に値を変換したい
Accessor/Mutatorを定義する
$accessored = $model->propertyとしたときにaccessorが呼び出される
$model->property = $valueとしたときにmutatorが呼び出される
デフォルトでcreated_atがCarbonのインスタンス変換されるのは裏でこの仕組が動いているから
Eloquent: Mutators - Laravel - The PHP Framework For Web Artisans
mutatorを利用するとlaravel-ide-helperが利用できなくなることがある
can not create helper define when there is a custom get mutator to id · Issue #595 · barryvdh/laravel-ide-helper · GitHub
DBに0/1で格納されている属性値を、取得時にbooleanにキャストしたい
Attribute Castingを使う
Eloquent: Mutators - Laravel - The PHP Framework For Web Artisans
DBにJSON型で保存しているものを取得時にarrayにcastしたいときも、このあたりのオプションを使うだけでOK
mutatorと一緒に使うと意図しない挙動になるので、一緒には利用しないこと
この機能はEloquentの基底の抽象クラスが利用しているConcerns\HasAttributesトレイトで実現されている。その実装を見てみよう。
例えばテーブルから値を取得する(getAttribute)の場合、ドキュメントで言うacccessor(コード上ではmutator。getXXXX())があった場合にそれが実行される。もしなければ、castingがあった場合にそれが実行される
Mutator(setXXXX())を持っている場合、生の値がそこにはいる。castは呼ばれない
ページネーションがしたい
Database: Pagination - Laravel - The PHP Framework For Web Artisans
キャッシング
Laravel Model Caching - Laravel News(未読)
開発環境でEloquentを書いたけどうまく動くのかサクッと試したい
Laravel Tinker#5c55357d3f44250000d24396
実際に使ってハマったことを書いていく
時刻はどうなる?
DBにはUTCで入る
Eloquentを通して取得する際に指定した時刻の補正になる(Asia/Tokyoなら+9:00される)
当然、DBがないとひけないので事前にmigrationする必要がある
Laravel 5で新規アプリケーションを0から作成するときの流れを参照
/icons/empty.icon $dateFormatでフォーマットが決められるとドキュメントに書いてあるけど、U以外に何が指定できるの?
http://php.net/manual/ja/function.date.php を参考にしろとStackOverflowなどでは言われていた
理由の説明はなし。コード上はHasAttributes traitに定義されているものを上書きしているのでこのあたりを読めばわかる?
内部でCarbonのcreateFormatFromにわたされる
このため http://php.net/manual/en/class.datetime.php の定数が利用可能
$dateFormat = \Datetime::ISO8601とか
変換を請け負うコードはこのあたり
https://github.com/laravel/framework/blob/e6c8aa0e39d8f91068ad1c299546536e9f25ef63/src/Illuminate/Database/Eloquent/Concerns/HasAttributes.php#L763
MySQLを使う場合、ISO8601には対応していないので$dateFormatは何も指定しないでよい
何も指定しないとMySQLのDATETIME型のフォーマットと同等になる
/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で指定しないといけない?そのままでいい?
Eloquentの複数代入を操作するfillableの挙動
Eloquentで一つ前のレコードをfindできない
castとaccessor/mutatorを組み合わせたときの挙動
mass assignmentの例外が発生する
fillableかguradを指定する必要がある
意図せず書き換えられないような仕様になっている
初めてのLaravel 5.6 : (11) Eloquent マスアサインメント – ララ帳
https://laravel.com/docs/5.8/eloquent#mass-assignment
設計
Laravelでつくる、深くて表現豊かなモデル - Qiita