为什么Laravel5.2雄辩的查询生成器在windows和linux中显示不同的结果?

时间:2016-09-26 05:37:19

标签: laravel eloquent laravel-5.2

我的表中有一个名为'status'的字段,字段类型为'tinyint',当我尝试使用eloquent查询构建器执行where条件时,它在linux和windows中给出了不同的结果。

表格结构:

enter image description here

我的代码是,

Os::all()->where('status', 1); 

它在Windows机器上工作正常,我得到的结果,但在Linux中它返回空集合。

然后我试了

Os::all()->where('status', '1'); 

它在Linux上工作正常,但不在Windows中:(

当我将'strict'标志设置为'false'时

Os::all()->where('status', 1, false);

它在两个平台上运行良好,为什么会这样?

1 个答案:

答案 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方法时,不要查看变量类型。

如何解决?

你可能没什么办法:

  1. 统一mysql配置 - 可能很难。
  2. 尝试查询构建器,其中:Os :: where(' status',1) - > get() - 也许以这种方式类型转换不会有问题
  3. 写入属性getter以在每次请求时更改状态属性类型:

    public function getStatusAttribute($ value)     {         return(int)$ value;     您需要选择强制转换为(字符串)或(int)。请记住,更改类型的状态在Collection中不可见 仅限于单一型号的对象。添加此吸气剂后,您不会 需要添加' false'属于Collection where。