【问题标题】:Detect changes when saving Laravel 4: Eloquent保存 Laravel 4 时检测更改:Eloquent
【发布时间】:2013-12-09 09:22:14
【问题描述】:

我正在使用 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 检测是否实际进行了任何更改?

【问题讨论】:

    标签: php laravel laravel-4 eloquent


    【解决方案1】:

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

    【讨论】:

    • 是的,但不是在枢轴关系上。再加上 Eloquent 模型无法回顾其定义的关系,这确实是一个失误。
    【解决方案2】:

    根据您想要实现的目标,您可以在这里选择一些选项。请先查看以下内容。

    带有 Ardent 包装的模型挂钩
    如果您对自动验证模型感兴趣,请查看 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 模型的 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! 
    });
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-05-30
    • 1970-01-01
    • 1970-01-01
    • 2014-09-05
    • 1970-01-01
    • 2014-08-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多