Laravel Eloquent查询逗号分隔access_users字段匹配登录用户ID的方法
Eloquent 逗号分隔权限字段查询方案
表结构说明
- 用户表
table_users
| id | name |
|---|---|
| 1 | Jhon Doe |
| 2 | Jhon Doe |
| 3 | Jhon Doe |
| 4 | Jhon Doe |
- 文件表
table_files(access_users为varchar类型,存储逗号分隔的可访问用户ID)
| id | file_name | access_users |
|---|---|---|
| 1 | exmp.xls | 1,2,3 |
| 2 | other.xls | 1,3 |
| 3 | logo.png | 2,3,4 |
需求说明
当前登录用户ID为2,查询table_files中access_users包含当前用户ID的所有file_name,期望返回结果:
exmp.xls logo.png
实现代码
使用MySQL原生FIND_IN_SET函数实现精准匹配,避免LIKE匹配时出现ID部分重合的错误(比如ID为2误匹配到12、22这类值)。
Eloquent 查询写法
先创建对应TableFile模型关联table_files表,查询代码如下:
// 实际业务中可替换为 auth()->id() 获取当前登录用户ID $currentUserId = 2; $fileNames = \App\Models\TableFile::select('file_name') ->whereRaw("FIND_IN_SET(?, access_users) > 0", [$currentUserId]) ->pluck('file_name'); // 输出数组格式结果调用 $fileNames->toArray() 即可
对应原生SQL
SELECT `file_name` FROM `table_files` WHERE FIND_IN_SET('2', `access_users`) > 0;
优化建议
当前用逗号分隔存储关联ID的设计不符合数据库范式,数据量较大时查询效率很低,后续建议改为中间表存储文件和用户的权限关联关系,查询、扩展性能都会更好。
内容的提问来源于stack exchange,提问作者ydmez
相关产品推荐
相关产品推荐

