Laravel Eloquentは変更があった場合にのみ更新されます質問する

Laravel Eloquentは変更があった場合にのみ更新されます質問する

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()に保存されたコピーと比較するだけです。これはメソッド内で実行されます:originalsyncOriginal()

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
}

おすすめ記事