2016-05-16 12 views
0

Tabelle tname wie unten:Laravel Modell Chunk mit Spalte Zustand und Aktualisierung

id name status 1 name1 0 2 name2 0 3 name3 0 4 name4 0

erstelle ich ein Modell für die Tabelle oben Tname genannt, dann möchte ich diese Tabelle Klumpen und ändern Sie den ‚Status‘ in die Tabelle:

$midModel = Tname::where('status', 0); 
$midModel->chunk(1, function ($rows) { 
foreach ($rows as $row) { 
    Tname::where('id', $row->id) 
     ->update([ 
       'status' => 1, 
     ]); 
} 
}); 

nach ersten Reihe Status geändert wurde, ‚Brocken‘ werden zweite Reihe vermissen, meine Frage ist, wie mit where('status', 0) zu Brocken und Reihen nicht verpassen? Ich versuche, where('status', 0) in dann Chunk setzen, aber es wird jedes Mal die Zeilen in der Tabelle Chunk.

Antwort

0

Sie tun tatsächlich falsch. Sie sind selecting all the rows which has status 0 & dann einzeln aktualisieren. Es wird noch viele Abfrage nehmen, wo sonst Sie alle Zeilen status 1 wie diese, unabhängig von dieser aktualisiert alle Zeilen

Tname::update('status', 1) 

festlegen können, ob es irgendwelche Zeilen hat status 0.

+0

Thx, können Sie nicht meine Punkte bekommen, wird der Code in meiner Frage ist nur ein Beispiel, ich mag nur Zeilen im Körper von „Brocken“ tun zu aktualisieren, kann aber nicht den ‚Status‘ verwendet ändern für Chunk, andernfalls wird die Anzahl der Chunk-Zeilen überschritten, da die "Chunk" -Funktion "offset and limit" in sql verwendet und nur jedes Mal den "offset" ändert, da "chunk" aus der ersten Zeile auswählt, also die Zeile filtern "status" wurde geändert und "offset" vorwärts bewegen führt normalerweise die fehlenden Zeilen. Nun, ich weiß, wir können nicht "update" im Körper von "Chunk", wenn die Update-Spalte für "Chunk" verwendet wird. –

0

Try This:

Dieser Code wird Update alle Reihe Status den Wert 0 auf 1

Tname::where('status', 0)->update(['status' => 1]); 
2

Nur über ein ähnliches Problem kam ich ...

chunk funktioniert, indem die Abfrage mit einem Offset ausgeführt wird, der mit jedem nachfolgenden Chunk übereinstimmt, wenn Sie also Spalten ändern, die die zugrunde liegenden Ergebnisse von q ändern würden sehr (d. h. status in Ihrer where-Klausel), wird Ihr Offset über die Zeilen springen, da Ihre Ergebnismenge jetzt kleiner ist als zuvor.

Die Lösung, die ich kam, war take innerhalb einer Schleife zu verwenden, die das Offset-Problem vermeidet.

do { 
    $midModel = Tname::where('status', 0)->take(10)->get(); 

    foreach ($midModel as $row) { 
     $row->update(['status' => 1]); 
    } 
while (count($midModel) > 0);