我指定了一个where子句:
$this->model = $model->where('published', '=', '1');
$this->model->get();
以上工作正常,给出查询日志:
select * from `products` where `published` = ?"
但我需要遍历数组中的where子句。
$arr = [['published', '=', '1'], ['id', '=', '1']];
foreach ($arr as $key => $value) {
$model = $model->where($value);
}
$model->get();
但是上面我找到了一个未找到的专栏。 'where子句'中的未知列'0'。
我哪里错了?
除此之外,如果我只是传入整个数组,它可以工作:
$model = $model->where($arr);
提供以下的查询日志:
"select * from `products` where (`published` = ? and `id` = ?)"
但where子句在括号中......为什么?
答案 0 :(得分:3)
$query = new Model;
foreach($arr as $condition){
$query->where($condition[0], $condition[1], $condition[2]);
}
$query->get();
这将创建如下所示的查询
Select * from table where published = 1 and id = 1;
您可以在此处看到值不在括号中,因为它们不是合并后的结果。
此解决方案将为where子句创建组合,最终结果将在括号中
$query = new Model;
$query->where(function($q) use ($arr){
foreach($arr as $condition){
$q->where($condition[0], $condition[1], $condition[2]);
}
}
$query->get();
这将导致您完成的确切查询。这是因为解决方案是对查询中发生的事情进行细分 $ this-> model->其中($ arr)
Select * from table where (published = 1 and id = 1);
要进一步了解为什么会发生这种情况,请查看以下示例
Select * from table where (id = 2 or product_id = 3) and (publish = 1 and status = 2)
通过此查询,您可以看到它是解决方案1和解决方案2的混合物。您解决它是
$query = new Model;
$query->where(function($q) use($input) {
$q->where('id', '=', $input['id1'])
->orWhere('id' , '=', $input['id2']);
}
直到现在我们已经创建了以下结果
Select * from table where (id = 1 or id = 2)
现在要添加查询的下一部分,我们将执行以下操作
//continued from above
//$query has the above condition which can be continued after the first where for chaining or in next line.
$query->where(function($q) use($input){
$q->where('publish' ,'=', 1)->where('status','=',1);
}
现在有了这个,最后的查询就变成了我们需要的查询。希望现在很清楚为什么会添加括号。
答案 1 :(得分:2)
我刚刚设法让事情发挥作用:
\DB::enableQueryLog();
$model = (new User)->newQuery();
$wheres = [
['forename', '=', 'Joe'],
['surname', '=', 'Bloggs'],
['email', '=', 'test@test.com']
];
foreach ($wheres as $where) {
// Call $model->where(...) passing in each array item as a separate param
call_user_func_array([$model, 'where'], $where);
}
$result = $model->get();
dd(\DB::getQueryLog(), $result);
这导致查询:
select * from `users` where `forename` = ? and `surname` = ? and `email` = ?
在创建运行查询的模型实例时,诀窍似乎是添加->newQuery()
部分。
注意,call_user_func_array
将数组的每个项目传递给$model->where(...)
。我发现将数组传递给->where(...)
会导致构建器尝试添加多个where
子句。使用call_user_func_array
的另一个好处是,它会传递您希望在每个子句中提供的许多参数 - 不需要精确为3。
答案 2 :(得分:0)
我认为你错过了专栏名称 试试这个:
foreach ($arr as $key => $value) {
$model = $model->where($value[0],$value[1],$value[2]);
}