最近遇到了复杂的查询语句 , 趁此机会总结一下 , laravel 使用数组格式作为参数的查询条件
假设有个用户表
-----------
-- 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;
}
}
以上基本包括日常的查询 , 遇到新的会继续补充