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

时间:2016-05-16 05:40:35

标签: php mysql laravel

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中,但每次都会将表中的所有行组合在一起。

3 个答案:

答案 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]);