Laravel等于在Where子句中返回空

时间:2015-02-19 15:12:57

标签: php laravel orm eloquent where

我在Laravel遇到了一个奇怪的问题,其中等号不会返回where子句中的任何值。但最奇怪的是,如果我使用!=而不是我得到结果!

小工具表

+----+-------------+-------------+
| id |    title    | widget_data |
+----+-------------+-------------+
| 1  |  my widget  |     xyz     |
+----+-------------+-------------+
| 2  |  the widget |     xyz     |
+----+-------------+-------------+
| 3  |  da widget  |     xyz     |
+----+-------------+-------------+
| 4  |  our widget |    xyz...   |
+----+-------------+-------------+
| 5  |  etc...     |    etc...   |
+----+-------------+-------------+

$ array_of_ids

array(
   [0] => 2,
   [1] => 3
)

继承我的代码。返回一个空数组(但应返回第2行和第3行)

$q = Widgets::where(function($query) use ($array_of_ids){
   foreach ($array_of_ids as $key => $value){
     $query->where('id', '=', $value);
   }
})->get()->toArray();

相同的代码,但使用!=代替,返回第1,4和5行......(应该如此)

$q = Widgets::where(function($query) use ($array_of_ids){
   foreach ($array_of_ids as $key => $value){
     $query->where('id', '!=', $value);
   }
})->get()->toArray();

发生什么事了?这是一个错误吗?有没有人遇到过这个问题?

1 个答案:

答案 0 :(得分:1)

你的查询是"让每个Widget的id为x,id为y,id为z(等)"。你想要"让每个Widget的id为x或者id为y或者id为Z"。如果你改变它,它应该工作:

$q = Widgets::where(function($query) use ($array_of_ids){
   foreach ($array_of_ids as $key => $value){
     $query->orWhere('id', '=', $value);
   }
})->get()->toArray();

原因!=正在以另一种方式工作是因为该查询说"得到每个Widget没有id为x且没有id为y且没有id为z(等等)"

虽然实际上有一种更简单的方法:

$q = Widgets::whereIn('id', $array_of_ids)->get()->toArray();