2013-11-24 17 views
14

Ich benutze das Laravel 4-Framework und versuche, eine Möglichkeit zu finden, Meldungen anzuzeigen, je nachdem, ob eine save() erfolgreich war oder nicht. Hier ist, was ich bisher:Änderungen beim Speichern von Laravel 4: Eloquent

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

Mein Problem ist, dass es immer true zurück, wenn ein Benutzer gespeichert wird, auch wenn keine Änderungen an der Datenbank vorgenommen wurden (ich weiß, das aus dem updated_at Zeitstempel). Gibt es eine Möglichkeit festzustellen, ob irgendwelche Änderungen vorgenommen wurden oder nicht mit Laravel?

Antwort

28

Je nachdem, was Sie erreichen möchten, haben Sie hier einige Optionen. Schauen Sie sich zuerst die folgenden an.

Modell Haken mit Ardent Paket
Wenn Sie in autovalidating Modellen interessiert sind, werfen Sie einen Blick auf die https://github.com/laravelbook/ardent Paket - Self-Validierung smart Modelle für Laravel Framework 4 des Eloquent O/RM. Neben bilden große Validierungsfunktionen bietet zusätzliche Modell Haken Sie verwenden können:

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 Modell Events
Wenn Sie weitere Sachen verwenden möchten nicht, können Sie einfach die Laravel Modell Ereignisse verwenden (das in der Tat Ardent wickelt sich in die Haken). Schauen Sie in die Dokumentation http://laravel.com/docs/eloquent#model-events

Eloquent Modelle feuern mehrere Veranstaltungen, so dass Sie in verschiedene Punkte in das Modell des Lebenszyklus einzuhaken die folgenden Methoden verwenden: Erstellen, erstellt, die Aktualisierung, aktualisiert, Speichern, gespeichert, gelöscht, gelöscht , Wiederherstellung, restauriert.

Immer wenn ein neues Element zum ersten Mal gespeichert wird, werden die erstellten und erstellten Ereignisse ausgelöst. Wenn ein Element nicht neu ist und die Speichermethode aufgerufen wird, werden die aktualisierenden/aktualisierten Ereignisse ausgelöst. In beiden Fällen werden die Ereignisse speichern/speichern ausgelöst.

Wenn false von der Erstellung zurückgegeben wird, zu aktualisieren, zu speichern, oder Ereignisse zu löschen, wird die Aktion abgebrochen werden:

Lösung
Schließlich reffering, Sie Sie hinterfragen die oben genannten Ansätze nutzen können in vielerlei Hinsicht, aber am offensichtlichsten können Sie es (oder nicht) mit der getDirty()api docs here Methode der Eloquent Models kombinieren. Es wird zum Beispiel mit dem Speichervorgang funktionieren.

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! 
}); 
+0

Sehr detaillierte Antwort! Danke vielmals. – Karl

+0

Laravel 5.3> https://github.com/laravel/framework/blob/5.3/src/Illuminate/Database/Eloquent/Model.php#L3177. – imme

5

Sie können sich die Methode getDirty() im Eloquent-Modell (model.php) ansehen. Diese Methode sollte die geänderten Attribute zurückgeben.

+3

is_dirty() funktioniert nicht auf Beziehungsdaten? – user269867

+0

Ja, aber nicht auf Pivot-Beziehungen. Das zusammen mit der Unfähigkeit eines redegewandten Modells, seine definierten Beziehungen rückblickend zu betrachten, ist wirklich ein Miss. –

Verwandte Themen