遇到的坑
写更新条件的时候要用到orWhere,于是乎直接这样写
->where('id', $id)->where('status',3)->orWhere('new_status', 2)
原本是想要查找到id=$id并且status=3或者new_status=2的记录然后更新,但是运行结果更新了所有status=3或new_status=2的记录。因为这里的sql生成是这样的:where id=8011 and status=3 or new_status=2,也就是说如果某个记录id不等于8011,但是满足new_status=2,也符合更新条件。他的执行逻辑是:(where id=8011 and status=3) or (new_status=2),完蛋,数据全乱了。
原因
orWhere拼写sql生成的语句是,and的优先级高于or。
解决
在laravel写orWhere,要用闭包。如果要表达上述的sql,则应该这样写:
->where('id', $id)
->where(function ($query) {
return $query->where('status', 3)->orWhere('new__status', 2);
})
->get();
总结
把并列的每个where想成同级的and