2014-08-31 7 views
13

J'ai une relation à un à plusieurs entre Device et Command modèles (chaque Device a beaucoup commands). Maintenant, je veux mettre à jour une collection de commandes en utilisant la méthode save(). Donc, je le code suivant:Comment mettre à jour une collection en utilisant Eloquent Laravel

$device = Device::find(1); 
$commands = $device->commands()->whereStatus("pending")->get(); 

$commands->status = "sent"; 
$commands->save(); 

Mais je suis une exception FatalErrorException avec un message d'erreur de Call to undefined method Illuminate\Database\Eloquent\Collection::save().

En d'autres termes, je suis à la recherche d'une requête MySQL équivalent de ce qui suit dans le Eloquent:

UPDATE commands SET status = 'sent' WHERE status = 'pending'; 

utilisant Laravel 4.2

Répondre

19

Vous pouvez essayer la méthode update:

$collection = $device->commands()->whereStatus("pending"); 
$data = $collection->get(); 
$collection->update(array("status" => "sent")); 
+0

Et comment puis-je obtenir la collection après la mise à jour? –

+1

Attribuer cette ligne à une variable - devrait le faire. – BenjaminRH

+0

Mais il renvoie le nombre d'enregistrements effectués ??? –

5

Depuis $commands est une collection, en changeant la valeur de $commands->status ne avoir l'effet que vous souhaitez (en réglant la valeur status sur 'envoyé' pour chaque élément de la collection).

Au lieu de cela, agir sur chaque élément de la collection indépendamment:

foreach ($commands as $command) 
{ 
    $command->status = 'sent'; 
    $command->save(); 
} 

Vous pouvez également mettre à jour les éléments de la base de données via Query Builder:

DB::table('your_table')->where('status', 'pending')->update(array('status' => 'pending')); 
Questions connexes