指尖上的记忆指尖上的记忆
首页
  • 基础
  • Laravel框架
  • Symfony框架
  • 基础
  • Gin框架
  • 基础
  • Spring框架
  • 命令
  • Nginx
  • Ai
  • Deploy
  • Docker
  • K8s
  • Micro
  • RabbitMQ
  • Mysql
  • PostgreSsql
  • Redis
  • MongoDb
  • Html
  • Js
  • 前端
  • 后端
  • Git
  • 知识扫盲
  • Golang
🌟 gitHub
首页
  • 基础
  • Laravel框架
  • Symfony框架
  • 基础
  • Gin框架
  • 基础
  • Spring框架
  • 命令
  • Nginx
  • Ai
  • Deploy
  • Docker
  • K8s
  • Micro
  • RabbitMQ
  • Mysql
  • PostgreSsql
  • Redis
  • MongoDb
  • Html
  • Js
  • 前端
  • 后端
  • Git
  • 知识扫盲
  • Golang
🌟 gitHub

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 查询了