我的表中有一个名为'status'的字段,字段类型为'tinyint',当我尝试使用eloquent查询构建器执行where条件时,它在linux和windows中给出了不同的结果。
表格结构:
我的代码是,
Os::all()->where('status', 1);
它在Windows机器上工作正常,我得到的结果,但在Linux中它返回空集合。
然后我试了
Os::all()->where('status', '1');
它在Linux上工作正常,但不在Windows中:(
当我将'strict'标志设置为'false'时
Os::all()->where('status', 1, false);
它在两个平台上运行良好,为什么会这样?
答案 0 :(得分:1)
我认为问题处于“状态”状态。变量类型。
首先,我想确定您知道您的情况其中(' status',1)不是在雄辩的查询构建器上,而是在集合中强>
Os :: all()查询返回Collection元素和方法其中(' status',1)正在处理这个Collection(数据库数据集)。 收集条件!=查询构建器中的条件。如果您想在查询构建器上创建位置,请以这种方式执行:
Os::where('status', 1)->get();
我认为问题在于Windows' status'变量正在转换为整数但在Linux中正在转换为字符串。这是由于mysql配置略有不同。现在看一下Collection,其中方法和一切都将清晰:
public function where($key, $value, $strict = true)
{
return $this->filter(function ($item) use ($key, $value, $strict) {
return $strict ? data_get($item, $key) === $value
: data_get($item, $key) == $value;
});
}
当$ strict = true方法时,不要查看变量类型。
如何解决?
你可能没什么办法:
写入属性getter以在每次请求时更改状态属性类型:
public function getStatusAttribute($ value) { return(int)$ value; 您需要选择强制转换为(字符串)或(int)。请记住,更改类型的状态在Collection中不可见 仅限于单一型号的对象。添加此吸气剂后,您不会 需要添加' false'属于Collection where。