フォームの画面でのユーザーのインプットをもとに既存のDBレコードを更新する際、もし何もデータ更新なしに「保存」ボタンを押されたらDBレコードを更新する?
もちろん、Javascriptで「保存」ボタンを無効にすることも可能。少なくともブラウザレベルでは。
しかしサーバーレベルではどう判断?
現在のデータとインプットデータを項目ごとに1つずつ比較?
そんな面倒なことを裏で自動的にEloquentは行ってくれます。
例えば、
class Product extends Model { protected $table = 'product'; protected $primary_key = 'product_id'; protected $timestamps = true; } use App\Product; $product = Product::find(1); //product_id = 1 のレコードをゲット $product->price = 2000; // まったく以前と同じ値段に $product->update();
update()
をコールしているのだけれど、何もデータに変更ないので、ここ裏ではDBの更新はありません(updated_atのタイムスタンプをチェックしてみてください)。賢いですね!
しかし、ここに例えば、この更新をもとに他のDBのレコードを更新することがプログラムされていたら?
$product->update(); update_other_table();
必要もないのにそちらも更新されては困ります。
更新されたかどうかを判断するには、
if($product->isDirty()) { $product->update(); update_other_table(); }
と簡単にチェックできます。ここisDirty()
はDBにレコードが保存される前にチェックする必要あります。つまり、update()
の前に。
さらに、1つの項目だけが変更されたかどうかをチェックするには、
if($product->isDirty('price')) { update_other_table(); }
素晴らしいですね。
ちなみに、この「ダーティ」。ダーティハリー、ダーティダンシングのムービーの「ダーティ」と同じです。
http://dictionary.goo.ne.jp/leaf/jn2/132268/m0u/
汚いの意味。
でもここでの意味は、「データが更新された」の意味。
メルマガ購読の申し込みはこちらから。