web-dev-qa-db-ja.com

Laravel変更が行われた場合の雄弁な更新

そのレコードに変更が加えられた場合に、雄弁なモデルを使用してLaravelのレコードを更新する方法はありますか?変更を保存するためにボタンを押すだけで、正当な理由もなく何度もデータベースを要求するユーザーがいらないようにします。ページで何かが変更されたかどうかに応じて保存ボタンを有効または無効にするjavascript関数がありますが、サーバー側でもこの種の機能を確実に実行できるかどうかを知りたいです。レコードに変更があるかどうかを確認するだけで、自分で(つまり、フレームワークの内部機能にアピールせずに)達成できることを知っていますが、そのようにする前に、Laravelかどうかを知りたい雄弁なモデルがすでにそれを処理しているので、車輪を再発明する必要はありません。

これは、レコードを更新するために使用する方法です。

$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();
68
user2755140

あなたはすでにそれをやっています!

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
}
139
lukasgeiter

編集フォームを使用している場合、このメソッドを追加したいので、このコードを使用してupdate(Request $request, $id)関数の変更を保存できます。

$post = Post::find($id);    
$post->fill($request->input())->save();

入力に同じ列名を付ける必要があることに注意してください。 fill()関数はすべての作業を行います:)

10
Ahmad Yousef

永続化した後でも、EloquentモデルでgetChanges()を使用できます。

4