<?php/***+------------------* madong*+------------------* Copyright (c) https://gitee.com/motion-code All rights reserved.*+------------------* Author: Mr. April (405784684@qq.com)*+------------------* Official Website: http://www.madong.tech*/namespace madong\query;use madong\query\enum\Operator;use madong\query\enum\QueryMode;/*** 查询参数解析器* 支持大写前缀和标准模式双兼容*/class QueryParamParser{/*** 解析查询参数** @param array $params* @return array ['mode', 'conditions', 'sort', 'page', 'pageSize', 'keyword', 'raw']*/public static function parse(array $params): array{// 检测模式$mode = self::detectMode($params);// 根据模式解析$conditions = match ($mode) {QueryMode::STANDARD->value => self::parseStandardMode($params),QueryMode::UPPERCASE->value => self::parseUppercaseMode($params),default => [],};// 解析排序$sort = self::parseSort($params);// 解析分页[$page, $pageSize] = self::parsePagination($params);// 提取关键词$keyword = self::parseKeyword($params);return ['mode' => $mode,'conditions' => $conditions,'sort' => $sort,'page' => $page,'pageSize' => $pageSize,'keyword' => $keyword,'raw' => $params,];}/*** 检测查询模式** @param array $params* @return string*/public static function detectMode(array $params): string{// 优先检测标准模式if (isset($params['filters'])) {return QueryMode::STANDARD->value;}// 检测大写前缀模式$uppercaseMap = Operator::uppercaseMap();foreach (array_keys($params) as $key) {if (preg_match('/^(' . implode('|', array_keys($uppercaseMap)) . ')_/', $key)) {return QueryMode::UPPERCASE->value;}}// 默认使用大写前缀模式(兼容现有系统)return QueryMode::UPPERCASE->value;}/*** 解析标准模式参数* filters[field]=operator:value** @param array $params* @return array*/private static function parseStandardMode(array $params): array{$conditions = [];$filters = $params['filters'] ?? [];if (!is_array($filters)) {return $conditions;}foreach ($filters as $field => $value) {// 解析 operator:value 格式$parts = explode(':', $value, 2);$operator = $parts[0] ?? 'eq';$filterValue = $parts[1] ?? null;// 特殊处理 null 操作符if (in_array($operator, ['null', 'not_null'])) {$conditions[] = new QueryCondition($field, $operator, null);} else {$conditions[] = new QueryCondition($field, $operator, $filterValue);}}return $conditions;}/*** 解析大写前缀模式参数* LIKE_user_name='yhg', EQ_status=1* 或者三元素数组格式: [['real_name', 'LIKE', '%超级%']]** @param array $params* @return array*/private static function parseUppercaseMode(array $params): array{$conditions = [];$skipKeys = ['page', 'limit', 'pageSize', 'orderBy', 'orderDirection', 'sort', 'keyword', 'fields'];foreach ($params as $key => $value) {// 跳过非查询字段if (in_array($key, $skipKeys)) {continue;}// 处理三元素数组格式: ['field', 'operator', 'value']if (is_array($value) && count($value) === 3 && isset($value[0], $value[1], $value[2])) {$field = $value[0];$operator = strtolower($value[1]);$filterValue = $value[2];$conditions[] = new QueryCondition($field, $operator, $filterValue);continue;}// 匹配大写前缀格式:操作符_字段if (preg_match('/^([A-Z]+)_(.+)$/', $key, $matches)) {$operatorUpper = $matches[1];$field = $matches[2];// 转换操作符$uppercaseMap = Operator::uppercaseMap();$operator = $uppercaseMap[$operatorUpper] ?? 'eq';$conditions[] = new QueryCondition($field, $operator, $value);} else {// 普通字段默认使用 eq 操作符$conditions[] = new QueryCondition($key, 'eq', $value);}}return $conditions;}/*** 解析排序参数** @param array $params* @return array*/private static function parseSort(array $params): array{$sort = [];// 标准模式:sort=field:direction 或 sort[]=field:directionif (isset($params['sort'])) {$sortParams = is_array($params['sort']) ? $params['sort'] : [$params['sort']];foreach ($sortParams as $sortParam) {$parts = explode(':', $sortParam);$field = $parts[0] ?? 'id';$direction = $parts[1] ?? 'desc';$sort[] = ['field' => $field, 'direction' => strtolower($direction)];}}// 大写前缀模式:orderBy & orderDirectionelseif (isset($params['orderBy'])) {$sort[] = ['field' => $params['orderBy'],'direction' => ($params['orderDirection'] ?? 'desc')];}// 默认排序if (empty($sort)) {$sort[] = ['field' => 'id', 'direction' => 'desc'];}return $sort;}/*** 解析分页参数** @param array $params* @return array [page, pageSize]*/private static function parsePagination(array $params): array{$page = (int)($params['page'] ?? 1);$pageSize = (int)($params['limit'] ?? $params['pageSize'] ?? 20);return [$page, max(1, min($pageSize, 100))];}/*** 解析关键词** @param array $params* @return string|null*/private static function parseKeyword(array $params): ?string{return $params['keyword'] ?? null;}/*** 验证操作符是否有效** @param string $operator* @return bool*/public static function isValidOperator(string $operator): bool{return Operator::isValid($operator);}/*** 获取所有支持的操作符** @return array*/public static function getSupportedOperators(): array{return Operator::all();}}
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。