2016-08-03 8 views
3

Mit Laravel 5.1 möchte ich ein category weich löschen, das Attribute automatisch auf seinen verwandten Modellen, question, setzen sollte.Aktualisieren verwandter Modellattribute beim Löschen

This SO Post empfiehlt auf dem Modell löschen Ereignisbindung:

public function destroy(Category $category) 
{ 
    $category->delete(); 
} 

Then ...

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

    static::deleting(function($category) { 
     $category->questions()->delete(); 
    }); 
} 

Dies funktioniert. Aber ich möchte nicht die zugehörigen Fragen löschen, sondern ein Attribut für jeden einzelnen setzen:

Dies scheint nicht zu funktionieren. Es gibt keinen Fehler, aber auch keine Abfragen werden in meinem Abfrageprotokollierer ausgelöst. Warum wird delete() auf jedes verwandte Modell ausgelöst, aber nicht auf Attributänderungen?

So wie ich das jetzt als solche zu arbeiten, aber es ist nicht sauber:

static::deleting(function($category) { 
     $questions = $category->questions()->get(); 
     foreach($questions as $q) { 
      $q->is_published = 'no'; 
      $q->save(); 
     } 
    }); 
+0

wenn Sie festlegen möchten Attribut Sie sie speichern müssen. Sie können den lokalen Bereich im Fragemodell verwenden, um eine Abfrage auszulösen, die alle Fragen mit einer bestimmten Kategorie-ID ändert. – ClearBoth

Antwort

1

Sie so etwas wie dieses

tun könnte in Ihrer Frage Modell

public function setIsPublished($isPublished) { 
    $this->is_published = $isPublished; 
    return $this; 
} 

Und Änderung

static::deleting(function($category) { 
    $questions = $category->questions()->get(); 
    foreach($questions as $q) { 
     $q->is_published = 'no'; 
     $q->save(); 
    } 
}); 

zu

static::deleting(function($category) { 
    foreach($category->questions as $q) { 
     $q->setIsPublished('no')->save(); 
    } 
}); 
+0

Ich persönlich bevorzuge die Verwendung von 0 oder 1, die in keiner oder keiner Sprache übersetzt werden können –