Laravel で、変更があった場合にのみ、eloquent モデルを使用してレコードを更新する方法はありますか? ユーザーが理由もなく何度もデータベースを要求して、変更を保存するためにボタンを押すだけにならないようにしたいです。javascript
ページに変更があったかどうかに応じて保存ボタンを有効または無効にする関数がありますが、この種の機能をサーバー側でも確実に実行できるかどうかを知りたいです。レコードが変更されたかどうかを確認するだけで、自分で (つまり、フレームワークの内部機能に頼らずに) 実現できることはわかっていますが、その方法を実行する前に、Laravel の eloquent モデルがすでにそれを処理しているかどうかを知りたいので、車輪の再発明は必要ありません。
これはレコードを更新するために使用する方法です:
$product = Product::find($data["id"]);
$product->title = $data["title"];
$product->description = $data["description"];
$product->price = $data["price"];
//etc (string values were previously sanitized for xss attacks)
$product->save();
ベストアンサー1
もうやってるよ!
save()
モデル内の何かが変更されたかどうかを確認します。変更されていない場合は、DB クエリは実行されません。
関連するコード部分は次のとおりですIlluminate\Database\Eloquent\Model@performUpdate
。
protected function performUpdate(Builder $query, array $options = [])
{
$dirty = $this->getDirty();
if (count($dirty) > 0)
{
// runs update query
}
return true;
}
このメソッドは、現在の属性をモデルの作成時getDirty()
に保存されたコピーと比較するだけです。これはメソッド内で実行されます:original
syncOriginal()
public function __construct(array $attributes = array())
{
$this->bootIfNotBooted();
$this->syncOriginal();
$this->fill($attributes);
}
public function syncOriginal()
{
$this->original = $this->attributes;
return $this;
}
モデルがダーティかどうか確認したい場合は、以下を呼び出しますisDirty()
:
if($product->isDirty()){
// changes have been made
}
または、特定の属性をチェックしたい場合:
if($product->isDirty('price')){
// price has changed
}