2014-05-13 13 views
13

In alcuni dei miei test, ho un modello utente che ho creato e ho eseguito alcuni metodi che hanno bisogno di salvare determinati attributi. In rotaie, chiamerei in genere qualcosa come user.reload che potrebbe ripopolare gli attributi dal database.Reloading model in laravel

C'è un modo in laravel per farlo? Ho letto l'API e non sono riuscito a trovare un metodo per farlo: http://laravel.com/api/4.1/Illuminate/Database/Eloquent/Model.html Qualche idea sul modo "giusto" per farlo?

+0

Forse il metodo getDirty() può aiutarti. http://laravel.com/api/source-class-Illuminate.Database.Eloquent.Model.html # 2149-2167 –

risposta

8

Non riesco nemmeno a vederlo. Sembra che dovrete:

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

È inoltre possibile creare uno voi stessi:

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

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

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

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

appena provato qui e sembra che funziona, non è sicuro fino a che punto questo va, però, è Eloquen una classe piuttosto grande.

1

Credo che la risposta di @Antonio sia la più corretta, ma a seconda del caso d'uso, è possibile utilizzare anche una combinazione di $model->setRawAttributes e $model->getAttributes.

$users = User::all(); 

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

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

    $user->setRawAttributes($rawAttributes); 
} 

L'aspetto negativo principale per questo è che sei solo "ricaricare" gli attributi di dati, non tutte le relazioni si è modificata, ecc, che potrebbe anche essere considerato il lato positivo.

EDIT

Come di L5 - fresh() è la strada da percorrere

27

C'era un commit presentato al ramo 4.0 realizzato nel mese di agosto per aggiungere un metodo di ricarica(), ma finora hasn sono stati uniti con le nuove filiali Laravel.

Ma ... Laravel 5 sta fornendo un metodo "fresco()" che restituirà una nuova istanza del modello corrente. Una volta che si sta utilizzando laravel 5.0 o più recente, è possibile ricaricare un modello come questo:

$model = $model->fresh(); 

noti che fresca() non aggiorna direttamente il vostro $ modello esistente, semplicemente restituisce una nuova istanza, in modo che perché dobbiamo usare "$ model =". Accetta anche un parametro con è una matrice di relazioni che si desidera caricare.

Se non sei ancora utilizza laravel 5 ma si desidera la stessa funzionalità, è possibile aggiungere questo metodo per il vostro modello (s):

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

Potrebbe valere la pena di creare una nuova domanda per questo con il tag laravel-5. – alexw

2

Grazie alla PR#19174 disponibile dal 5.4.24 è il refresh method.

$model->refresh(); 

In questo modo non si ha a che fare con riassegnazione come è mostrato in altre risposte con il metodo fresh, che in genere non è utile se si desidera aggiornare un modello che è stato passato in un altro metodo perché la variabile l'assegnazione sarà fuori portata per i contesti chiamanti da utilizzare in seguito.

+1

Anche questo funziona alla grande quando si utilizzano eventi modello! – kjdion84