2016-09-06 95 views
1

我指定一个where子句:循环where子句?

$this->model = $model->where('published', '=', '1'); 
$this->model->get(); 

以上工作得很好,给人的查询日志:

select * from `products` where `published` = ?" 

但我需要通过的循环,从阵列中的条款。

$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

我是否认为你想将数组中的任何值传递给你的'where'是正确的?例如,如果你有'[['col','=','val']],那么会导致'$ model-> where('col','=','val')'? – Jonathon

+0

是的,那是正确的,我已经可以用$ model-> where($ arr);但是这个问题是它引起我的where子句的括号。它为什么这样做,括号是什么意思? – panthro

+0

尝试删除赋值,使$'model = $ model-> where(...);'变成'$ model-> where(...);'。这是否做了什么?当你执行像'$ model-> where(function($ query){// Extra where子句});'' – Jonathon

回答

0

我想你错过了列名。
试试这个:

foreach ($arr as $key => $value) { 
    $model = $model->where($value[0],$value[1],$value[2]); 
} 
+0

这不是一个关联数组。 – panthro

+0

@panthro抱歉没有注意到。但是,由于'$ value'本身就是一个数组,上面的更新会执行吗? – jaysingkar

+0

如果数组没有3个值,该怎么办? – panthro

2

我好不容易才得到的东西的工作:

\DB::enableQueryLog(); 

$model = (new User)->newQuery(); 

$wheres = [ 
    ['forename', '=', 'Joe'], 
    ['surname', '=', 'Bloggs'], 
    ['email', '=', '[email protected]'] 
]; 

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

解决方案1 ​​

$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; 

在这里你可以看到这些值不在括号中,因为它们不是组合结果。

解决方案2

该解决方案将建立一个联合的where子句和最后的结果将在括号

$query = new Model; 
$query->where(function($q) use ($arr){ 
    foreach($arr as $condition){ 
     $q->where($condition[0], $condition[1], $condition[2]); 
    } 
} 

$query->get(); 

这将导致你已经实现精确查询。这是因为该解决方案是什么是你的查询中发生的故障$这个 - >模型 - >在哪里($ 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的混合物

到目前为止,我们已经创建了以下结果

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); 
} 
这个

现在,最终的查询就会变成一个我们需要。现在希望明确为什么添加括号。

+0

谢谢,只是一个简短的问题,括号实际上在where子句的部分附近做了什么? – panthro

+0

这就像BODMAS(Brackets然后关闭然后分裂然后乘法然后加法然后减法)。括号内容将首先被计算,然后结果将被用于最终比较。 细分 **从表中选择*(条件)和(条件) >从表中选择*真实和真实; ** –