ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
最近遇到了复杂的查询语句 , 趁此机会总结一下 , laravel 使用数组格式作为参数的查询条件 假设有个用户表 ----------- -- user 用户表 ----------- ``` ----------- -- user 用户表 ----------- CREATE TABLE user ( user_id mediumint(8) NOT NULL AUTO_INCREMENT COMMENT '用户ID', group_id mediumint(8) NOT NULL COMMENT '用户组ID', user_name varchar(32) NOT NULL COMMENT '用户名', user_pwd varchar(32) NOT NULL COMMENT '用户密码', user_phone int(12) NOT NULL COMMENT '用户手机号码', user_sex varchar(6) NOT NULL COMMENT '用户性别', user_qq mediumint(9) NOT NULL COMMENT '用户QQ号码', user_email varchar(64) NOT NULL COMMENT '用户EMAIL地址', user_address varchar(255) NOT NULL COMMENT '用户地址', user_mark mediumint(9) NOT NULL COMMENT '用户积分', user_rank_id tinyint(3) NOT NULL COMMENT '用户等级', user_last_login_ip varchar(15) NOT NULL COMMENT '用户上一次登录IP地址', user_birthday int(13) NOT NULL COMMENT '用户生日', user_description varchar(255) NOT NULL COMMENT '自我描述', user_image_url varchar(255) NOT NULL COMMENT '用户头像存储路径', user_school varchar(255) NOT NULL COMMENT '毕业学校', user_register_time int(13) NOT NULL COMMENT '用户注册时间', user_register_ip varchar(15) NOT NULL COMMENT '用户注册时IP地址', user_last_update_time int(13) NOT NULL COMMENT '用户上次更新博客时间', user_weibo varchar(255) NOT NULL COMMENT '用户微博', user_blood_type char(3) NOT NULL COMMENT '用户血型', user_says varchar(255) NOT NULL COMMENT '用户语录', user_lock tinyint(3) NOT NULL COMMENT '是否锁定,0为不锁定,1为锁定', user_freeze tinyint(3) NOT NULL COMMENT '是否冻结,0为不冻结,1为冻结', user_power varchar(255) NOT NULL COMMENT '拥有权限', PRIMARY KEY (user_id) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 ; ``` 创建模型 , 然后依据各种条件查询数据 ``` <?php //博客用户查询 namespace Services\User; # 用户数据模型 use App\Models\User; class UserService { /** * [getList description] * @author admin 2020-10-26 * @param array $params [description] * @return [type] [description] */ public function getList( $params=[] ) { $where = $this->getListWhere( $params ); # 查询条数 $count = User::where( $where )->count(); # 分页 $page_size = isset($params['page_size']) && intval($params['page_size'])>0?intval($params['page_size']):10; $page = isset($params['page']) && intval($params['page'])>0?intval($params['page']):1; # 查询数据 $rows = User::where( $where ) ->orderBy('user_id','DESC') ->offset( ($page-1)*$page_size ) ->limit( $page_size ) ->get() ->toArray(); # 返回数据 return [ 'rows' => $rows, 'count' => $count, 'page_count' => $count>0?intval(ceil($count / $page_size)) : 1, ]; } /** * [getListWhere description] * @author admin 2020-10-26 * @param array $params [description] * @return [type] [description] */ public function getListWhere( $params=[] ) { $where = []; # 用户名 精确查询 = if( isset($params['user_name']) && !empty($params['user_name']) ){ $where[] = ['user_name', '=', $params['user_name']]; } # 用户名 模糊查询 LIKE if( isset($params['user_name']) && !empty($params['user_name']) ){ $where[] = ['user_name', 'LIKE', '%'.$params['user_name'].'%']; } # 注册时间 区间查询 > < >= <= if( isset($params['start_time']) && !empty($params['start_time']) ){ $where[] = ['user_register_time', '>=', $params['start_time']]; } if( isset($params['end_time']) && !empty($params['end_time']) ){ $where[] = ['user_register_time', '<=', $params['end_time']]; } # 手机号码 OR查询 if( isset($params['user_phone']) && !empty($params['user_phone']) ){ $where[] = ['user_name', '=', $params['user_phone'], 'OR']; } # AND OR 组合查询 # 首先user_power字段的存储格式为 [文章,图片,视频,音频] # 例如你想要的sql是 # SELECT * FROM user WHERE user_sex=1 AND user_rank_id=2 AND (user_power LIKE '%文章%' OR user_power LIKE '%图片%') # 这块是我遇到的最大的问题 # user_sex # user_rank_id 遵循以上 # 用户权限集合 user_powers if( isset($params['user_powers']) && !empty($params['user_powers']) ){ $where[] = [function( $query )use( $params ){ $tmp_where = []; foreach ($params['user_powers'] as $key=>$value) { $tmp_where[] = ['user_power', 'LIKE', '%'.$value.'%', 'OR']; } return $query->where($tmp_where); }]; } # IN 数组 以user_id为例 if( isset($params['user_ids']) && !empty($params['user_ids']) ){ $where[] = [function( $query )use( $params ){ return $query->whereIn( 'user_id', $params['user_ids'] ); }]; } # 结果返回 return $where; } } ``` 以上基本包括日常的查询 , 遇到新的会继续补充