thinkPHP find_in_set
时间: 2025-03-19 21:18:16 浏览: 33
### 如何在 ThinkPHP 中正确使用 FIND_IN_SET 函数
#### 使用方法概述
在 ThinkPHP 框架中,可以利用 `where` 方法或者自定义 SQL 来调用 MySQL 的 `FIND_IN_SET()` 函数。以下是几种常见的实现方式。
---
#### 方式一:通过 `whereRaw` 实现
对于较新的版本(如 ThinkPHP 6 或者 ThinkPHP 8),可以直接使用 `whereRaw` 方法来构建复杂的查询条件:
```php
$obj->whereRaw('FIND_IN_SET(:param, tags)', ['param' => $site_id]);
```
上述代码表示,在字段 `tags` 中查找是否存在 `$site_id` 值。如果存在,则满足查询条件[^2]。
---
#### 方式二:通过 `Db::raw` 构建表达式
适用于 ThinkPHP 5 及其衍生版本,可以通过 `\think\Db::raw` 将原生 SQL 表达式嵌入到查询条件中:
```php
$where[] = ['EXP', \think\Db::raw("FIND_IN_SET({$site_id}, site_ids)")];
$result = ExamModel::where($where)->select();
```
此代码片段的作用是从 `exam` 表中筛选出 `site_ids` 字段包含 `$site_id` 的记录[^1]。
---
#### 方式三:直接拼接字符串作为查询条件
另一种常见的方式是手动构造 `FIND_IN_SET` 查询语句并将其设置为 `_string` 类型的查询条件:
```php
$where['_string'] = "FIND_IN_SET('{$attr_id}', object_ids)";
$data = ModelName::where($where)->select();
```
这种方式适合于简单的场景,但在复杂条件下可能不够灵活[^3]。
---
#### 完整示例代码
假设有一个模型名为 `ExamModel`,并且需要查询 `site_ids` 列表中包含特定值的数据,完整的代码如下所示:
```php
use app\common\model\ExamModel;
$site_id = 2;
$where = [
'status' => ['=', 2],
];
// 添加 FIND_IN_SET 条件
$where[] = ['EXP', \think\Db::raw("FIND_IN_SET({$site_id}, site_ids)")];
try {
$exams = ExamModel::where($where)->select()->toArray();
success('返回成功', $exams);
} catch (\Exception $e) {
error('查询失败', $e->getMessage());
}
```
以上代码实现了基于 `FIND_IN_SET` 的多条件联合查询,并将结果转换为数组形式输出。
---
#### 注意事项
1. **性能优化**
虽然 `FIND_IN_SET` 很方便,但由于它无法充分利用索引,因此当数据量较大时可能会导致性能下降。建议尽可能改用标准化的关系表设计替代存储逗号分隔的字符串列表[^4]。
2. **安全性**
如果输入参数来源于外部请求,请务必对其进行严格校验和转义处理,防止 SQL 注入攻击。
3. **兼容性**
不同版本的 ThinkPHP 对原始 SQL 支持程度略有差异,请根据具体框架版本调整语法结构。
---
###
阅读全文
相关推荐


















