具有列条件和更新的 Laravel 模型块

0 php mysql laravel

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 块,但它每次都会将表中的所有行分块。

cfl*_*ann 5

刚刚自己遇到了类似的问题......

chunk通过使用随每个连续块增加的偏移量运行查询来工作,因此如果您正在更改会更改查询基础结果的任何列(即status在您的 where 子句中),您的偏移量将跳过行,因为您的结果set 现在比以前小了。

我想出的解决方案是takedo...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)