フォームの画面でのユーザーのインプットをもとに既存の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/

汚いの意味。

でもここでの意味は、「データが更新された」の意味。

By khino