laravel之多条件的or或and的like查询: 场景:有时候我们需要对同一个字段做多个值的like查询,这个字段的多个值是由逗号隔开的字符串,对于前端页面可能会把这个字符串拆开 以标签的形式展开,然后做条件筛选
一般都是 or like 查询,有如下两种方式: ①直接在 where 条件里使用
if (isset($params['tags'])){
$conditions = explode(',', $params['tags']);
$query = $query->where(function ($query) use($conditions){
foreach ($conditions as $k=> $val){
if ($k == 0){
$query->where('tags', 'like', '%'.$val.'%');
}else{
$query->orWhere('tags', 'like', '%'.$val.'%');
}
}
});
}
②在model里通过scope实现 首先在model里定义:
public function scopeOrWhereLike($query, $conditions)
{
return $query->where(function ($query) use($conditions){
foreach ($conditions as $k=> $val){
if ($k == 0){
$query->where('tags', 'like', '%'.$val.'%');
}else{
$query->orWhere('tags', 'like', '%'.$val.'%');
}
}
});
//也可以直接返回 $query
// return $query;
}
// 然后在查询的时候调用这个scope
if (isset($params['tags'])){
$query = $query->orWhereLike(explode(',', $params['tags']));
}
再写一个 and like,这个在同字段肯定是查不出结果的,除非正好是一个值: ①直接在 where 条件里使用
if (isset($params['tags'])){
$conditions = [];
foreach (explode(',', $params['tags']) as $val){
$conditions[] = ['tags', 'like', '%'.$val.'%'];
}
$query = $query->where($conditions);
}
②在model里通过scope实现 首先在scope里面定义:
public function scopeAndWhereLike($query, $conditions)
{
$where = [];
foreach ($conditions as $val){
$where[] = ['tags', 'like', '%'.$val.'%'];
}
return $query->where($where);
//下面这个写法也是可以的
// $query->where(function ($query) use($conditions){
// foreach ($conditions as $val){
// $query->where('tags', 'like', '%'.$val.'%');
// }
// });
//也可以直接返回 $query
// return $query;
}
// 然后在查询的时候调用这个scope
if (isset($params['tags'])){
$query = $query->andWhereLike(explode(',', $params['tags']));
}
上面两种情形,当 $conditions 包括多个字段的时候,直接取 $key 就可以实现多字段的 or/and like 查询了
