web-dev-qa-db-fra.com

Modèle de rechargement en laravel

Dans certains de mes tests, j'ai créé un modèle utilisateur et j'exécute des méthodes nécessitant de sauvegarder certains attributs. Dans Rails, j'appellerais généralement quelque chose comme user.reload qui repeuplerait les attributs de la base de données.

Y at-il un moyen dans laravel de le faire? J'ai lu l'API et je n'ai pas trouvé de méthode: http://laravel.com/api/4.1/Illuminate/Database/Eloquent/Model.html Des idées sur la "bonne" façon de le faire ce?

23
matthew

Je ne peux pas le voir non plus. On dirait que vous devrez:

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

Vous pouvez également en créer un vous-même:

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

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

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

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

Je viens de le tester ici et il semble que ça marche, je ne sais pas jusqu'où cela va, cependant, Eloquen est une très grande classe.

Un ajout de commit à la branche 4.0 a été effectué en août pour ajouter une méthode reload (), mais il n'a pas encore été fusionné avec les nouvelles branches Laravel.

Mais ... Laravel 5 fournit une méthode "fresh ()" qui retournera une nouvelle instance du modèle actuel. Une fois que vous utilisez Laravel 5.0 ou plus récent, vous pouvez recharger un modèle comme celui-ci:

$model = $model->fresh(); 

Notez que fresh () ne met pas directement à jour votre modèle $ existant, il ne fait que renvoyer une nouvelle instance. C'est pourquoi nous devons utiliser "$ model =". Il accepte également un paramètre avec un tableau de relations que vous souhaitez charger rapidement.

Si vous n'utilisez pas encore Laravel 5 mais que vous souhaitiez bénéficier des mêmes fonctionnalités, vous pouvez ajouter cette méthode à vos modèles:

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

Merci à PR # 19174 disponible depuis 5.4.24 est la méthode refresh .

$model->refresh();

De cette façon, vous n'avez pas à gérer la réaffectation, comme le montrent d'autres réponses à l'aide de la méthode fresh, ce qui n'est généralement pas utile si vous souhaitez actualiser un modèle passé à une autre méthode, car l'affectation de variable sera hors de portée pour les contextes d'appel à utiliser plus tard.

21
Jeff Puckett

Je pense que la réponse de @Antonio est la plus correcte, mais selon le cas d'utilisation, vous pouvez également utiliser une combinaison de $model->setRawAttributes et $model->getAttributes.

$users = User::all();

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

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

    $user->setRawAttributes($rawAttributes);
}

Le principal inconvénient est que vous ne faites que "recharger" les attributs de données, et non les relations que vous avez modifiées, etc. Cela peut également être considéré comme le côté positif. 

MODIFIER

À partir de L5 - fresh() est la voie à suivre

1
Chris
  • refresh() est une opération mutable: elle rechargera l'instance de modèle actuelle à partir de la base de données.
  • fresh() est une opération immuable: elle retourne une nouvelle instance de modèle à partir de la base de données. Cela n'affecte pas l'instance actuelle.
// 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