Laravel 6 Eloquent Driven Development Slide Laravel x Vue.js 勉強会 in ゆめみ札幌 vol.2 https://larasap.connpass.com/event/148886/
EloquentDrivenDevelopment2019/10/31 YamaYuski Infiniteloop
View Slide
YamaYuski a.k.a 赤魔導士こないだ PHP カンファレンス北海道 2019に登壇しました前回も発表しました
RDB インテグレーションLaravel Databases
Laravel DB下記 Relational DB に対応- MySQL- PostgreSQL- SQLite- SQL Server内部では PDO を利用している.env とコンフィグファイルで接続情報を指定複数の RDB を同時に扱うことも可能
Query Builder一般的な Fluent Query Builder を搭載大多数のクエリはクエリビルダで完結可能
Migration複数 RDB に対応したマイグレーションを搭載PHP でマイグレーションファイルを書くことで自動で SQL 化コマンドで手軽に適用
Factoryランダムレコード生成器テスト時手軽に必要なレコードを生成出来る=> Laravel はDB 依存テストが簡単!テストだけ sqlite も可能!
Faker?それっぽいダミー値を生成してくれるライブラリ各言語用のモジュールも搭載(佐藤 太郎とか John Doe とか)様々なダミー値を生成出来る面白い奴
エ↑レクヮント↓(能弁な, 雄弁な) - éləkwəntEloquent
Eloquent ORM?- Active Record 型(自律型) Object-Relational Mapper- モデルクラス自身がクエリを発行する- RDB テーブルと 1 対 1 で紐づくモデルクラス- `users テーブル` -> `class User extends Model`- 1 インスタンスが 1 レコード- 山ほど機能を搭載
“郷に入っては郷に従え17 Tips
1. テーブル名・クラス名は明瞭にしよう名は体を表すテーブル名とクラス名は必ずしも一致しなくて良いテーブル名はリストで見る用にクラス名は外部キー名に使う暗黙テーブル名は避けようStr::snake(Str::pluralStudly(class_basename($this)))
2. プライマリキーは `id` にしようリレーション含めデフォルトの扱いが `id` という名前余計な設定を増やさないために、基本は `id` にしよう
3. マイグレーションを手軽にやろうどの RDB でも同じマイグレーションファイルで実行可能(制限はある)よく使う PK AUTO_INCREMENT などのエイリアスが豊富created_at, updated_at も一行
4. $table->timestamps() は気を付けよう基本は全テーブルに `created_at` `updated_at` TIMESTAMP カラムMySQL TIMESTAMP 型は 2038 年までしか保持出来ないので気を付けよう
5. Model を作ったら Factory も作ろうテストしたり Seeding する時に活用出来るよくあるステートごとに state 定義を増やして手軽に生成しよう
6. $dates, $casts で手軽にキャストしよう`declare(strict_types=1);` の時に活用出来る0, 1 の値を boolean としたり日時を Carbon としたりjson の値を array としたり出来るPDO 的に基本全部 string で返ってくるので自動キャストは便利!
7. 垂直分割時は $connection を指定しようDB をまたぐ join をしないように注意そもそも Active Record で join は微妙(最適化必須の所だけにしよう)
8. $attributes は設定しないようにしようデフォルト値は RDB 側の DEFAULT 制約でまかなおう
9. @property をつけようlaravel-ide-helper が自動で付けてくれるIDE でプロパティの補完が効くようになる
10. Local Scope で where 句に名前をつけようクエリビルダを拡張出来る命名出来るって大事!@method active() と書けば少し IDE 補完サポートも得られる
11. Routing Explicit Model Binding を使おうAPI 中で PK 指定する場合は Explicit Model Binding でモデルを取得
12. Policy を設定して認可を手軽に実装しようこのユーザが特定の Model に対して何が出来るかを定義する@can Blade Directive とかで簡単に使える
13. API Resources でレスポンスさせてみようModel を json として返す時の型として使えるRESTful API っぽいものを作る時に便利
14. テストに RDB を用いようユニットテストでも RDB を使ってしまえば、モックやスタブを書かなくてすむし、 DB 依存の問題も発見出来るテストが遅くなるが、そこは並列化とかでカバー
15. コマンド・クエリ責務分離(CQRS) を使おうトランザクションが必要な追加・更新・削除処理をコマンド取得だけの処理をクエリと考えて関心を分離し、コマンドは厳密に、クエリは高速になるよう書くクエリ側では Eloquent を使わなくても良いかも
16. CarbonImmutable を使ってみようCarbon 2.0 から追加された DateTimeImmutable な Carbonこれで clone() し忘れてバグることもなくなる!
17. DB::listen でクエリログを収集しようDB::listen(callable $callback) で SQL と実行時間を取得出来るデバッグ環境では EXPLAIN を追加発行して、問題のあるクエリでないかログで確認出来るように拡張しようパスワードなどの bindings をログに残さないように気を付けようlaravel-debugbar がうまいことその辺やってくれるのでオススメjson API の場合は代わりにログなどに吐くようにしよう
Fin.1. テーブル名・クラス名は明瞭にしよう2. プライマリキーは `id` にしよう3. マイグレーションを手軽にやろう4. $table->timestamps() は気を付けよう5. Model を作ったら Factory も作ろう6. $dates, $casts で手軽にキャストしよう7. 垂直分割時は $connection を指定しよう8. $attributes は設定しないようにしよう9. @property をつけよう10. Local Scope で where 句に名前をつけよう11. Routing Explicit Model Binding を使おう12. Policy を設定して認可を手軽に実装しよう13. API Resources でレスポンスさせてみよう14. テストに RDB を用いよう15. コマンド・クエリ責務分離(CQRS) を使おう16. CarbonImmutable を使ってみよう17. DB::listen でクエリログを収集しよう