表tname
如下所示:
id name status
1 name1 0
2 name2 0
3 name3 0
4 name4 0
我为上面的表创建了一个名为Tname
的模型,然后我想要将这个表块化并更改表中的'status':
$midModel = Tname::where('status', 0);
$midModel->chunk(1, function ($rows) {
foreach ($rows as $row) {
Tname::where('id', $row->id)
->update([
'status' => 1,
]);
}
});
第一行状态更改后,'chunk'将错过第二行,我的问题是如何使用where('status', 0)
进行分块并且不会错过行?
我尝试将where('status', 0)
放入chunk中,但每次都会将表中的所有行组合在一起。
答案 0 :(得分:4)
我自己也遇到过类似的问题......
chunk
通过运行带有每个连续块的偏移量的查询来工作,所以如果要更改任何会改变查询的基础结果的列(即status
在哪里因为你的结果集现在比以前小了,所以你的偏移量会跳过正确的行。
我想出的解决方案是在take
循环中使用do...while
,这可以避免偏移问题。
do {
$midModel = Tname::where('status', 0)->take(10)->get();
foreach ($midModel as $row) {
$row->update(['status' => 1]);
}
while (count($midModel) > 0);
答案 1 :(得分:1)
你实际上做错了。您 selecting all the rows which has status 0
&然后单独更新。需要进行多次查询,您还可以设置所有行 status 1
Tname::update('status', 1)
如果有任何行 status 0
,这将更新所有行。
答案 2 :(得分:0)
试试这个:
此代码将更新所有行状态,其值为0到1
Tname::where('status', 0)->update(['status' => 1]);