2013-02-14 20 views
23

Come posso aggiornare più campi in un modello Eloquent? Diciamo che ho avuto in questo modo:Laravel 4: come aggiornare più campi in un modello Eloquent?

$user = User::where("username", "=", "rok"); 

E poi ho tutti questi parametri del modello:

$new_user_data = array("email" => "[email protected]", "is_superuser" => 1, ...); 

Non posso fare:

$user->update($new_user_data); 

Qual è il modo corretto? Spero non un foreach.

Tuttavia, quanto segue funziona. È questa la strada da percorrere?

User::where("id", "=", $user->id)->update($new_user_data); 

Il problema con l'ultimo (oltre essendo goffa) è che quando viene utilizzato da un contesto oggetto, i campi aggiornati non sono visibili nella variabile $this.

+0

Sì, penso che quando si aggiornano diverse colonne, il 'update()' funzione funziona solo quando si aggiorna direttamente il modello. Altrimenti, devi usare 'fill()' e 'save()'. – Pathros

risposta

55

Il metodo che stai cercando è fill():

$user = User::where ("username","rok"); // note that this shortcut is available if the comparison is = 
$new_user_data = array(...); 
$user->fill($new_user_data); 
$user->save(); 

In realtà, si potrebbe fare $user->fill($new_user_data)->save(); ma trovo il bilancio separato un po 'più facile da leggere e correggere.

+0

È un peccato che non abbiano update() o save() con i nuovi dati ... ma questo funziona. Assicurati anche di esaminare il pacchetto Ardent (rende le cose molto più belle con la convalida e l'aggiornamento degli unique). – Tom

+5

Qualcuno ha ricevuto questo errore: - Chiama a metodo non definito Illuminate \ Database \ Query \ Builder :: fill() – Bik

+0

Funziona su Laravel 5. Muchas gracias. – racl101

3

dovrei suggerire di utilizzare il codice più breve, come ad esempio

$new_user_data=array('a'=>'n','b'=>'m'); 
    $user=User::whereUsername('rok');//camelCase replaces "=" sign 
    $user->fill($new_user_data)->save(); 

O anche più breve

$new_user_data=array('a'=>'n','b'=>'m'); 
    User::whereUsername('rok')->update($new_user_data);//camelCase replaces "=" sign 

credo che l'ultima affermazione è più facile da mettere a punto e sembra più bello.
Avviso: se la tabella contiene molti utenti denominati "rok", entrambe le istruzioni menzionate aggiorneranno tutti i registri contemporaneamente. Dovresti sempre aggiornare i registri con il valore del campo id.

9

Siete alla ricerca di questo:

$user = User::where("username","rok") 
       ->update( 
         array( 
          "email" => "[email protected]", 
          "is_superuser" => 1, 
          // .. 
          ) 
         ); 

consultare: http://laravel.com/docs/4.2/eloquent#insert-update-delete

+0

Sebbene questo collegamento possa rispondere alla domanda, è meglio includere qui le parti essenziali della risposta e fornire il link per riferimento. Le risposte di solo collegamento possono diventare non valide se la pagina collegata cambia – abarisone

+0

@Kumar Ramalingam - Nice, grazie :) – Sambhav

+0

@Sambhav - Benvenuto –

0

Prova questa,

// took required data out of the request 
$postData = request(
    [ 
     'firstName', 
     'lastName', 
     'address1', 
     'address2', 
     'address3', 
     'postcode', 
     'phone', 
     'imageURL', 
    ] 
); 
// persisted it to the database 
DB::table('users') 
    ->where('id', auth()->user()->id) 
); 
Problemi correlati