Slide 1

Slide 1 text

Laravel 初めての業務で遭遇したハマりポイント×2 Takeru Furuichi (Twitter:@takfjp) LaraVue勉強会 2019.05.22

Slide 2

Slide 2 text

Laravel を初めて業務で使った時にハマったことを 話します ・Eloquent ORM  既存案件の参入時に起こったこと ・論理削除  新規案件の開発時に起こったこと

Slide 3

Slide 3 text

Model class Something extends Model { protected $table = 'something'; protected $fillable = [ ‘name’ ]; public $timestamps = false; }

Slide 4

Slide 4 text

Controller public function store(Request $request) { $something = new Something(); $something->name = $request->name; $something->save(); } Form とかからの送信で受け付けたデータを新規保存

Slide 5

Slide 5 text

レコードが追加されない! save の戻り値は true だった  レコードが新規にできるはずが…

Slide 6

Slide 6 text

Why?

Slide 7

Slide 7 text

https://readouble.com/laravel/5.8/ja/eloquent.html 主キー Eloquent は更にテーブルの主キーが id というカラム名であると 想定しています。この規約をオーバーライドする場合は、 protected の primaryKey プロパティを定義してください。

Slide 8

Slide 8 text

テーブルの中身は 主キーが大文字の ID だった!

Slide 9

Slide 9 text

Model class Something extends Model { protected $table = 'something'; //明示的に追加 protected $primaryKey = 'ID'; public $timestamps = false; }

Slide 10

Slide 10 text

Eloquent を活用するなら主キーは なるべく「 id 」に統一しましょう‍

Slide 11

Slide 11 text

論理削除 ・Company と Employee のように親子関係にあるテーブル / Modelを作成 ・employee テーブルに company_id という外部キーを設定 ・Company↔Employee の関係は1対多 ・Company モデルでトレイトを使う use SoftDelets;

Slide 12

Slide 12 text

マイグレーションファイル up() メソッド内 //子テーブルに対象レコードがある場合、親テーブルのレコード削除を禁止 ->onDelete('restrict'); //親テーブルのレコード更新は許可 ->onUpdate('cascade'); Schema::table('employee', function (Blueprint $table) { $table->integer('company_id')->unsigned(); $table->foreign('company_id')->references('id')->on('companies') ->onDelete('restrict') ->onUpdate('cascade'); });

Slide 13

Slide 13 text

employee を持つ Company で Company::destroy 制約で Company レコードの削除を防げるはず・・・ →普通に Company が削除できてしまった!

Slide 14

Slide 14 text

Why?

Slide 15

Slide 15 text

use SoftDeleteで論理削除をさせている場合 物理削除と違ってdeleted_atにタイムスタンプを書き込む だけ -> 制約をすり抜けてしまう -> onDelete()はトリガーされない

Slide 16

Slide 16 text

Laravel Soft Cascade https://laravel-news.com/cascading-soft-deletes

Slide 17

Slide 17 text

Thank you!