保存Laravel 4时检测更改:Eloquent

Kar*_*arl 14 php laravel eloquent laravel-4

我正在使用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));
Run Code Online (Sandbox Code Playgroud)

我的问题是,即使没有对数据库进行任何更改,它总是在保存用户时返回true(我从updated_at时间戳中知道这一点).有没有办法检测是否实际使用Laravel进行了任何更改?

Gad*_*oma 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.
Run Code Online (Sandbox Code Playgroud)

Laravel模型事件
如果你不想使用任何其他东西,你可以使用Laravel模型事件(事实上Ardent正在包装钩子).查看文档http://laravel.com/docs/eloquent#model-events

Eloquent模型可以触发多个事件,允许您使用以下方法挂钩模型生命周期中的各个点:创建,创建,更新,更新,保存,保存,删除,删除,恢复,恢复.

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

如果从创建,更新,保存或删除事件返回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! 
});
Run Code Online (Sandbox Code Playgroud)


Rob*_*ijn 5

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

  • is_dirty()不适用于关系数据? (3认同)