Laravel 多条件 AND , OR条件组合查询

最近遇到了复杂的查询语句 ,  趁此机会总结一下 , 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;
	}

}

以上基本包括日常的查询 , 遇到新的会继续补充

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值