强制更新+更新事件的触发器

时间:2014-06-08 00:28:33

标签: php laravel eloquent

我注意到如果模型中没有变化,模型将不会调用更新或更新的事件。我想它会将getOriginalgetDirty进行比较。

但是,当我只更新模型的关系时,例如附加新类别,因为此操作位于更新的事件中,它将永远不会被触发。

在这种特定情况下,在更新事件期间会删除类别,在更新事件期间会附加新类别。但只有在我更改模型中的至少一个值时才会触发它。

我错过了什么吗?

这种情况在4.1中没有发生,现在正在发生4.2,作曲家今天更新了。

更新

以下是我的产品型号启动中的updatingupdated事件:

public static function boot()
{
    parent::boot();

    static::updating(function($model)
    {
        $model->author_id = 1;//Auth::user()->id;

        $history = new ProductHistory($model->getOriginal());            
        $model->history()->save($history);

        $model->languages()->update(array(Product::$historyKey => $history->id));
        $model->currencies()->update(array(Product::$historyKey => $history->id));
        $model->paymentTypes()->update(array(Product::$historyKey => $history->id));
    }

    static::updated(function($model)
    {
        if(Input::has('languages')) $model->languages()->attach(Input::get('languages'));
        if(Input::has('currencies')) $model->currencies()->attach(Input::get('currencies'));
        if(Input::has('payment_types')) $model->paymentTypes()->attach(Input::get('payment_types'));
    }
}

updating中的BaseModel事件:

    static::updating(function($model)
    {
        if(property_exists(get_class($model), 'rules'))
        {               
           if(!$model->validate()) return false;
        }
    });

这在4.2中不再起作用,因为当模型没有变化时,忽略更新和更新的事件。我的修复仅使用savingsaved个事件,在这些事件中,我可以通过检查getOriginal()是否存在来确定是否正在更新或创建模型不

1 个答案:

答案 0 :(得分:0)

触发父模型update的最简单方法是在子模型中添加$touches属性,例如,如果要更新ProductHistory模型,是另一个模型的孩子,然后在ProductHistory模型中添加以下属性:

// Add this in ProductHistory model
protected $touches = array('Product');

现在,每当您更新ProductHistory时,它都会更新其中的updated_at字段,并在此情况下更新Product模型,因此updated_at字段将被更新,更新的事件也将触发,更新父模型更新时的updated_at属性是有意义的。

检查Laravel网站中的Touching Parent Timestamps