tname如下表:
id name status
1 name1 0
2 name2 0
3 name3 0
4 name4 0
我为上面名为 的表创建了一个模型Tname,然后我想对该表进行分块并更改表中的“状态”:
$midModel = Tname::where('status', 0);
$midModel->chunk(1, function ($rows) {
foreach ($rows as $row) {
Tname::where('id', $row->id)
->update([
'status' => 1,
]);
}
});
Run Code Online (Sandbox Code Playgroud)
第一行状态改变后,'chunk' 会漏掉第二行,我的问题是如何分块where('status', 0)并且不会漏掉行?我尝试放入where('status', 0)then 块,但它每次都会将表中的所有行分块。
刚刚自己遇到了类似的问题......
chunk通过使用随每个连续块增加的偏移量运行查询来工作,因此如果您正在更改会更改查询基础结果的任何列(即status在您的 where 子句中),您的偏移量将跳过行,因为您的结果set 现在比以前小了。
我想出的解决方案是take在do...while循环内部使用,这避免了偏移问题。
do {
$midModel = Tname::where('status', 0)->take(10)->get();
foreach ($midModel as $row) {
$row->update(['status' => 1]);
}
while (count($midModel) > 0);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4927 次 |
| 最近记录: |