フォームの画面でのユーザーのインプットをもとに既存の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/
汚いの意味。
でもここでの意味は、「データが更新された」の意味。
メルマガ購読の申し込みはこちらから。