2014-05-13 13 views
13

In einigen meiner Tests habe ich ein Benutzermodell, das ich erstellt habe, und ich führe einige Methoden aus, die bestimmte Attribute speichern müssen. In Schienen würde ich normalerweise etwas wie user.reload nennen, das die Attribute von der Datenbank wiederbevölkern würde.Zurückladen des Modells in Laravel

Gibt es einen Weg in Laravel, das zu tun? Ich lese durch die API und konnte keine Methode dafür finden: http://laravel.com/api/4.1/Illuminate/Database/Eloquent/Model.html Irgendwelche Ideen auf dem "richtigen" Weg, dies zu tun?

+0

Vielleicht kann Ihnen die Methode getDirty() helfen. http://laravel.com/api/source-class-Illuminate.Database.Eloquent.Model.html # 2149-2167 –

Antwort

8

Ich kann es auch nicht sehen.

$model = $model->find($model->id); 

Sie auch ein selbst erstellen können: Sieht aus wie Sie haben, werde

public function reload() 
{ 
    $instance = new static; 

    $instance = $instance->newQuery()->find($this->{$this->primaryKey}); 

    $this->attributes = $instance->attributes; 

    $this->original = $instance->original; 
} 

Gerade getestet es hier und es sieht es funktioniert, nicht sicher, wie weit das geht, aber Eloquen ist eine ziemlich große Klasse.

1

Ich glaube @Antonio 'Antwort ist am richtigsten, aber je nach Anwendungsfall können Sie auch eine Kombination von $model->setRawAttributes und $model->getAttributes verwenden.

$users = User::all(); 

foreach($users as $user) 
{ 
    $rawAttributes = $user->getAttributes(); 

    // manipulate user as required 
    // .. 
    // Once done, return attribute state 

    $user->setRawAttributes($rawAttributes); 
} 

Der primäre Nachteil ist, dass Sie nur „Nachladen“ das Datenattribut, keine Beziehungen, die Sie geändert haben, etc. Das ist auch die Plus-Seite angesehen werden könnte.

EDIT

Ab L5 - fresh() ist der Weg

27

Es gab eine commit zum 4.0 Zweig im August gemacht vorgelegt gehen einen Reload() -Methode hinzufügen, aber so weit es hasn wurden nicht mit den neueren Laravel-Filialen zusammengelegt.

Aber ... Laravel 5 bietet eine "fresh()" -Methode, die eine neue Instanz des aktuellen Modells zurückgibt. Sobald Sie verwenden Laravel 5.0 oder höher, können Sie ein Modell wie folgt neu zu laden:

$model = $model->fresh(); 

Beachten Sie, dass frisch() nicht direkt Ihr bestehenden $ Modell aktualisieren, es gibt nur eine neue Instanz, so dass das, warum müssen wir "$ model =" verwenden. Es akzeptiert auch einen Parameter mit einem Array von Beziehungen, die Sie möchten, dass es geladen wird.

Wenn Sie noch nicht verwenden Laravel 5, aber Sie wollen die gleiche Funktionalität, können Sie diese Methode zum Modell hinzufügen (e):

public function fresh(array $with = array()) 
{ 
    $key = $this->getKeyName(); 
    return $this->exists ? static::with($with)->where($key, $this->getKey())->first() : null; 
} 
+0

Es könnte sich lohnen, eine neue Frage dafür mit dem Laravel-5-Tag zu erstellen. – alexw

2

Dank PR#19174 verfügbar seit 5.4.24 ist die refresh method.

$model->refresh(); 

Auf diese Weise müssen Sie nicht mit Neuzuordnung umgehen, wie in anderen Antworten mit dem fresh Verfahren gezeigt, das, wenn Sie in der Regel nicht hilfreich wollen ein Modell aktualisieren, die in einer anderen Methode, weil die Variable übergeben worden sind Die Zuordnung ist für die später zu verwendenden aufrufenden Kontexte nicht möglich.

+1

Dies funktioniert auch gut für die Verwendung von Modell-Events! – kjdion84

Verwandte Themen