2014-08-31 10 views
13

Ich habe eine Eins zu viele Beziehung zwischen Device und Command Modelle (jede Device hat viele commands). Jetzt möchte ich eine Sammlung von Befehlen mit der Methode save() aktualisieren. Also, habe ich den folgenden Code:Wie aktualisiert man eine Sammlung mit Eloquent Laravel

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

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

Aber ich habe eine FatalErrorException Ausnahme mit einer Fehlermeldung von Call to undefined method Illuminate\Database\Eloquent\Collection::save().

Mit anderen Worten, ich bin auf der Suche für eine äquivalente MySQL Abfrage der folgenden in der Eloquent:

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

Laravel 4.2 mit

Antwort

19

Sie könnten die update Methode versuchen:

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

Und wie könnte ich die Sammlung nach der Aktualisierung bekommen? –

+1

Weisen Sie diese Zeile einer Variablen zu - tun Sie es. – BenjaminRH

+0

Aber es gibt die Anzahl der betroffenen Datensätze zurück ??? –

5

Seit $commands eine Sammlung ist, wird der Wert von $commands->status ändert sich nicht Haben Sie den Effekt, den Sie beabsichtigen (den Wert von status für jedes Element in der Sammlung zu 'senden') festlegen.

Stattdessen wirken auf jedes Element in der Sammlung unabhängig:

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

Sie können auch die Elemente in der Datenbank via Query Builder aktualisieren:

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