保存Laravel 4时检测更改:Eloquent

时间:2013-11-24 19:15:59

标签: php laravel 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进行了任何更改?

2 个答案:

答案 0 :(得分:28)

根据您想要达到的目标,您可以在此处选择一些选项。请先查看以下内容。

模型挂钩与Ardent包
如果您对autovalidating模型感兴趣,请查看https://github.com/laravelbook/ardent包 - Laravel Framework 4的Eloquent O / 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模型可以激活几个事件,让您可以连接各种事件   使用以下方法指出模型的生命周期:创建,   创建,更新,更新,保存,保存,删除,删除,   恢复,恢复。

     

每当第一次保存新项目时,创建和   创建的事件将会触发。如果某个项不是新项,则保存方法为   调用,更新/更新事件将触发。在这两种情况下,   保存/保存的事件将会触发。

     

如果从创建,更新,保存或删除返回false   事件,该行动将被取消:

<强>解决方案
最后,对你提出疑问你可以通过多种方式利用上述方法,但最明显的是你可以将它(或不是)与Eloquent Models的 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! 
});

答案 1 :(得分:5)

您可以查看Eloquent模型中的getDirty()方法(model.php)。 此方法应返回已更改的属性。