2014-06-08 10 views
0

J'ai remarqué qu'un modèle n'appelait pas l'actualisation ou l'événement mis à jour s'il n'y avait pas de modifications dans le modèle. Je suppose qu'il va comparer getOriginal avec getDirty.Forcer le déclenchement de la mise à jour + les événements mis à jour

Cependant, lorsque je ne mets à jour que la relation d'un modèle, par exemple, en attachant de nouvelles catégories, cette opération étant présente dans l'événement mis à jour, elle ne sera jamais déclenchée.

Dans cette situation spécifique, les catégories sont supprimées lors de la mise à jour et de nouvelles lors de la mise à jour de l'événement. Mais il n'est déclenché que si je change au moins une valeur dans le modèle.

Ai-je raté quelque chose?

Cela ne se passait pas en 4.1, il se passe maintenant avec 4.2, compositeur mis à jour aujourd'hui.

Mise à jour:

Voici les événements updating et updated dans le coffre de mon modèle de produit:

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')); 
    } 
} 

et l'événement updating dans le BaseModel:

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

Cette ne fonctionne plus dans 4.2, comme la mise à jour et u Les événements pdated sont ignorés lorsqu'il n'y a pas de modifications pour le modèle. Mon correction devait utiliser seulement saving et saved événements, au sein de ces événements, je peux identifier si le modèle est mis à jour ou créé en vérifiant si getOriginal() existe ou non.

+0

st votre code responsable de la mise à jour. –

+0

@ WereWolf-TheAlpha Salut à nouveau M. Werewolf, j'ai mis à jour la question. – user2094178

Répondre

0

La meilleure façon de déclencher le modèle est juste ajouter de update parent la propriété $touches dans le modèle de l'enfant, par exemple, si vous mettez à jour le modèle ProductHistory qui est l'enfant d'un autre modèle, puis ajoutez simplement propriété suivante dans votre modèle ProductHistory :

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

maintenant, chaque fois que vous mettez à jour le ProductHistory il va également mettre à jour le champ updated_at dans son modèle parant et dans ce cas, il est le modèle Product, de sorte que le champ updated_at sera mis à jour et d'événements mis à jour se déclenche aussi, et il fait sens de mettre à jour le updated_at pro perty du modèle parent lorsque son modèle enfant est mis à jour.

Vérifiez Touching Parent Timestamps dans Laravel site Web.

+0

Cela semble bon monsieur, mais dans cette situation, ProductHistory est créé à l'intérieur de l'événement de mise à jour. Est-ce que 'getOriginal()' ne devrait pas renvoyer les relations des modèles? – user2094178

Questions connexes