Skip to content

搜索器

搜索器用于简化条件查询,使查询条件更加易读和可维护。

命名规则

搜索器的命名规则为searchFieldNameAttr,其中FieldName为数据表字段的驼峰转换,Attr为固定后缀。搜索器仅在调用withSearch方法的时候触发。

转换规则

在ThinkPHP框架中,数据表字段名与搜索器方法名之间存在明确的命名转换规则:

转换示例

数据表字段名(小写加下划线)搜索器方法名(驼峰命名)
create_timesearchCreateTimeAttr
user_namesearchUserNameAttr
statussearchStatusAttr
scoresearchScoreAttr

转换过程

  1. 将下划线分隔的字段名转换为驼峰命名:

    • create_timeCreateTime
  2. 添加前缀search和后缀Attr

    • CreateTimesearchCreateTimeAttr
  3. 在调用withSearch时,使用原始的小写加下划线字段名:

    php
    User::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)

基于 MIT 协议发布