搜索器
搜索器用于简化条件查询,使查询条件更加易读和可维护。
命名规则
搜索器的命名规则为searchFieldNameAttr,其中FieldName为数据表字段的驼峰转换,Attr为固定后缀。搜索器仅在调用withSearch方法的时候触发。
转换规则
在ThinkPHP框架中,数据表字段名与搜索器方法名之间存在明确的命名转换规则:
转换示例
| 数据表字段名(小写加下划线) | 搜索器方法名(驼峰命名) |
|---|---|
create_time | searchCreateTimeAttr |
user_name | searchUserNameAttr |
status | searchStatusAttr |
score | searchScoreAttr |
转换过程
将下划线分隔的字段名转换为驼峰命名:
create_time→CreateTime
添加前缀
search和后缀Attr:CreateTime→searchCreateTimeAttr
在调用
withSearch时,使用原始的小写加下划线字段名:phpUser::withSearch(['create_time'], ['create_time' => [...]]);
框架内部会自动处理这种命名转换,将字段名转换为对应的搜索器方法名并调用。
用户名搜索器
php
/**
* 搜索器:用户名称
* @param $query
* @param $value
* @param $data
*/
public function searchUserNameAttr($query, $value, $data)
{
if ($value !== '' && $value !== null) {
$query->where('user_name','like', $value . '%');
}
}使用方式:
php
// 搜索用户名包含"张三"的用户
$users = User::withSearch(['user_name'], ['user_name' => '张三'])->select();默认情况下,搜索器会首先检查数据是否存在(如果不存在该项数据则跳过),最终生成的SQL语句类似于:
sql
SELECT * FROM `user` WHERE (`user_name` LIKE '%张三%')状态搜索器
php
/**
* 搜索器:用户状态
* @param $query
* @param $value
* @param $data
*/
public function searchStatusAttr($query, $value, $data)
{
if ($value !== '' && $value !== null) {
$query->where("status", "=", $value);
}
}使用方式:
php
// 搜索启用状态的用户
$users = User::withSearch(['status'], ['status' => 1])->select();最终生成的SQL语句类似于:
sql
SELECT * FROM `user` WHERE (`status` = 1)时间范围搜索器
php
/**
* 搜索器:注册时间范围
* @param $query
* @param $value
* @param $data
*/
public function searchCreateTimeAttr($query, $value, $data)
{
if ($value && is_array($value) && count($value) == 2) {
$query->whereBetweenTime("create_time", $value[0], $value[1]);
}
}使用方式:
php
// 搜索2023年注册的用户
$users = User::withSearch(['create_time'], ['create_time' => ['2023-01-01', '2023-12-31']])->select();最终生成的SQL语句类似于:
sql
SELECT * FROM `user` WHERE (`create_time` BETWEEN '2023-01-01 00:00:00' AND '2023-12-31 00:00:00')数值范围搜索器
php
/**
* 搜索器:用户积分范围
* @param $query
* @param $value
* @param $data
*/
public function searchScoreAttr($query, $value, $data)
{
if ($value && is_array($value) && count($value) == 2) {
$query->whereBetween("score", $value[0], $value[1]);
}
}使用方式:
php
// 搜索积分在100-500之间的用户
$users = User::withSearch(['score'], ['score' => [100, 500]])->select();最终生成的SQL语句类似于:
sql
SELECT * FROM `user` WHERE (`score` BETWEEN 100 AND 500)