使用单个数组传递多个 WHERE 条件(使用 LIKE)
Using a single array to pass multiple WHERE conditions (with LIKE)
理论
It's been discussed 可以使用以下代码将多个 WHERE
子句传递给 Laravel 的 Eloquent 中的单个 where()
方法:
$condition = array('field_1' => 'value_1', 'field_2' => 'value_2');
$users = User::where($conditon)->get();
上面的代码简单地将数组的键值对与 AND
链接在一起,生成如下:
SELECT * FROM `users` WHERE field_1 = value_1 AND field_2 = value_2;
问题
以上键值对基于相等性。 是否可以对字符串使用相同的实现,我们使用 LIKE
而不是 =
?
我的意思的抽象例子:
$condition = array(
array('field_1', 'like', '%value_1%'),
array('field_2', 'like', '%value_2%')
);
$users = User::where($conditon)->get();
这肯定可以通过多次 ->where(...)
用法来完成。不过,传递单个数组是否可行?
不,不是。但在内部 Laravel 也只是用一个循环来完成。
Illuminate\Database\Query\Builder@where
if (is_array($column))
{
return $this->whereNested(function($query) use ($column)
{
foreach ($column as $key => $value)
{
$query->where($key, '=', $value);
}
}, $boolean);
}
我建议你这样做:
$condition = array(
'field_1' => '%value_1%',
'field_2' => '%value_2%'
);
$users = User::where(function($q) use ($condition){
foreach($condition as $key => $value){
$q->where($key, 'LIKE', $value);
}
})->get();
理论
It's been discussed 可以使用以下代码将多个 WHERE
子句传递给 Laravel 的 Eloquent 中的单个 where()
方法:
$condition = array('field_1' => 'value_1', 'field_2' => 'value_2');
$users = User::where($conditon)->get();
上面的代码简单地将数组的键值对与 AND
链接在一起,生成如下:
SELECT * FROM `users` WHERE field_1 = value_1 AND field_2 = value_2;
问题
以上键值对基于相等性。 是否可以对字符串使用相同的实现,我们使用 LIKE
而不是 =
?
我的意思的抽象例子:
$condition = array(
array('field_1', 'like', '%value_1%'),
array('field_2', 'like', '%value_2%')
);
$users = User::where($conditon)->get();
这肯定可以通过多次 ->where(...)
用法来完成。不过,传递单个数组是否可行?
不,不是。但在内部 Laravel 也只是用一个循环来完成。
Illuminate\Database\Query\Builder@where
if (is_array($column))
{
return $this->whereNested(function($query) use ($column)
{
foreach ($column as $key => $value)
{
$query->where($key, '=', $value);
}
}, $boolean);
}
我建议你这样做:
$condition = array(
'field_1' => '%value_1%',
'field_2' => '%value_2%'
);
$users = User::where(function($q) use ($condition){
foreach($condition as $key => $value){
$q->where($key, 'LIKE', $value);
}
})->get();