Обнаруживать изменения при сохранении Laravel 4: Eloquent

Я использую структуру Laravel 4, и я пытаюсь разработать способ отображения уведомлений в зависимости от того, был ли save() успешным или нет. Вот что я до сих пор:

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

Моя проблема в том, что он всегда возвращает true, когда пользователь сохраняется, даже если никаких изменений в базе данных не было (я знаю это из метки update_at). Есть ли способ определить, действительно ли были сделаны какие-либо изменения или нет использования Laravel?

Ответы

Ответ 1

В зависимости от того, чего вы хотите достичь, у вас есть несколько вариантов. Сначала проверьте ниже.

Модельные крючки с плавным пакетом
Если вы заинтересованы в автомодулирующих моделях, посмотрите на https://github.com/laravelbook/ardent пакет - Самонастраивающиеся интеллектуальные модели для Laravel Framework 4 Eloquent O/RM. Помимо отличных функций проверки, он предлагает дополнительные крючки модели, которые вы можете использовать:

Here 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 Model Events (что на самом деле Ardent обертывает крючки). Изучите документы http://laravel.com/docs/eloquent#model-events

Красноречивые модели запускают несколько событий, позволяя вам подключаться к различным точек жизненного цикла модели, используя следующие методы: создание, создавать, обновлять, обновлять, сохранять, сохранять, удалять, удалять, восстановление, восстановление.

Всякий раз, когда новый элемент сохраняется в первый раз, создание и создаются события. Если элемент не является новым, а метод сохранения - вызывается обновление/обновление событий. В обоих случаях сохраненные/сохраненные события будут срабатывать.

Если ложь возвращается из создания, обновления, сохранения или удаления события, действие будет отменено:

Решение
Наконец, повторив вам вопрос, вы можете использовать вышеупомянутые подходы разными способами, но наиболее очевидно, что вы можете объединить его (или нет) с 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! 
});

Ответ 2

Вы можете взглянуть на метод getDirty() в модели Eloquent (model.php). Этот метод должен возвращать измененные атрибуты.