web-dev-qa-db-ja.com

保存時に変更を検出Laravel 4:Eloquent

Laravel 4フレームワークを使用しており、save()が成功したかどうかに応じて、通知を表示する方法を模索しています。これが私が持っているものです。遠い:

    if($user->save()) {
        Session::flash('success','woohoo success');
    } else {
        Session::flash('error','uhoh error');
    }
    return Redirect::action('UsersController@show', array('users' => $id));

私の問題は、データベースに変更が加えられていなくても、ユーザーが保存されると常にtrueを返すことです(これはupdated_atタイムスタンプからわかります)。 Laravelを使用して実際に変更が加えられたかどうかを検出する方法はありますか?

14
Karl

達成したいことに応じて、ここにいくつかのオプションがあります。最初に以下をチェックしてください。

Ardentパッケージのモデルフック
モデルの自動検証に興味がある場合は、 https://github.com/laravelbook/ardent パッケージ-Laravel Framework4のEloquentO/RM。優れた検証機能とは別に、使用できる追加のモデルフックを提供します。

Here's the complete list of available hooks:

before/afterCreate()
before/afterSave()
before/afterUpdate()
before/afterDelete()
before/afterValidate() - when returning false will halt validation, thus making save() operations fail as well since the validation was a failure.

Laravelモデルイベント
追加のものを使用したくない場合は、Laravelモデルイベント(実際にはArdentがフックでラップしています)を使用できます)。ドキュメントを調べてください- http://laravel.com/docs/eloquent#model-events

Eloquentモデルはいくつかのイベントを発生させ、次の方法を使用してモデルのライフサイクルのさまざまなポイントにフックできるようにします:作成、作成、更新、更新、保存、保存、削除、削除、復元、復元。

新しいアイテムが初めて保存されるたびに、作成中および作成済みのイベントが発生します。アイテムが新しくなく、saveメソッドが呼び出された場合、更新/更新されたイベントが発生します。どちらの場合も、保存/保存されたイベントが発生します。

イベントの作成、更新、保存、または削除からfalseが返された場合、アクションはキャンセルされます。

解決策
最後に、上記のアプローチをさまざまな方法で利用できますが、最も明白なのは、それをEloquentモデルと組み合わせる(または組み合わせない)ことができるという質問です。getDirty()api docs here メソッド。たとえば、保存イベントで機能します。

Yourmodel::saving(function($model)
{
    foreach($model->getDirty() as $attribute => $value){
        $original= $model->getOriginal($attribute);
        echo "Changed $attribute from '$original' to '$value'<br/>\r\n";
    }
    return true; //if false the model wont save! 
});
28
Gadoma

Eloquentモデル( model.php )のgetDirty()メソッドを見ることができます。このメソッドは、変更された属性を返す必要があります。

5
Rob Gordijn