webentwicklung-frage-antwort-db.com.de

Modell in Laravel nachladen

In einigen Tests habe ich ein Benutzermodell, das ich erstellt habe, und ich führe einige Methoden aus, die bestimmte Attribute speichern müssen. In Rails würde ich normalerweise etwas wie user.reload aufrufen, das die Attribute aus der Datenbank erneut ausfüllt.

Gibt es eine Möglichkeit in Laravel, das zu tun? Ich habe die API gelesen und konnte keine Methode dafür finden: http://laravel.com/api/4.1/Illuminate/Database/Eloquent/Model.html Irgendwelche Ideen auf "richtige" Art und Weise diese?

23
matthew

Ich kann es auch nicht sehen. Sieht aus wie Sie müssen:

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

Sie können auch selbst eine erstellen:

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

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

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

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

Ich habe es gerade hier getestet und es sieht so aus, als ob es funktioniert, nicht sicher, wie weit das geht, aber Eloquen ist eine ziemlich große Klasse.

Es wurde ein commit an den 4.0-Zweig übermittelt, der im August gemacht wurde, um eine reload () - Methode hinzuzufügen, aber bisher wurde sie nicht mit den neueren Laravel - Zweigen zusammengeführt.

Aber ... Laravel 5 stellt eine "fresh ()" -Methode bereit, die return eine neue Instanz des aktuellen Modells wird. Sobald Sie Laravel 5.0 oder neuer verwenden, können Sie ein Modell wie folgt neu laden:

$model = $model->fresh(); 

Beachten Sie, dass fresh () Ihr vorhandenes $ model nicht direkt aktualisiert, sondern nur eine neue Instanz zurückgibt. Deshalb müssen wir "$ model =" verwenden. Es akzeptiert auch einen Parameter mit einem Array von Beziehungen, die Sie gerne laden möchten.

Wenn Sie Laravel 5 noch nicht verwenden, aber die gleiche Funktionalität wünschen, können Sie diese Methode Ihren Modellen hinzufügen:

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

Danke an PR # 19174 verfügbar seit 5.4.24 ist die refresh-Methode .

$model->refresh();

Auf diese Weise müssen Sie sich nicht mit der Neuzuordnung befassen, wie in anderen Antworten mit der fresh-Methode gezeigt wird. Dies ist im Allgemeinen nicht hilfreich, wenn Sie ein Modell aktualisieren möchten, das an eine andere Methode übergeben wurde, da die Zuweisung von Variablen nicht möglich ist die aufrufenden Kontexte, die später verwendet werden sollen.

21
Jeff Puckett

Ich glaube, die Antwort von @Antonio ist die richtigste, aber abhängig vom Anwendungsfall können Sie auch eine Kombination aus $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 Hauptnachteil ist, dass Sie nur die Datenattribute "neu laden", nicht die von Ihnen geänderten Beziehungen usw. Dies kann auch als Pluspunkt betrachtet werden. 

EDIT

Ab L5 ist fresh() der Weg zu gehen

1
Chris
  • refresh() ist eine veränderliche Operation: Die aktuelle Modellinstanz wird erneut aus der Datenbank geladen.
  • fresh() ist eine unveränderliche Operation: Sie gibt eine neue Modellinstanz aus der Datenbank zurück. Die aktuelle Instanz ist davon nicht betroffen.
// Database state:
$user=User::create([
  'name' => 'John',
]);

// Model (memory) state:
$user->name = 'Sarah';

$user2 = $user->fresh();
// $user->name => 'Sarah';
// $user2->name => 'John'

$user->refresh();
// $user->name => 'John'
0
igaster