php中,现在有业务逻辑是这样的,所有的用户都有个uppath字段,这个字段中包含了自己上级人的所有id字符串这些字符串都是以逗号拼接的,例如我想查我伞下一级人都有哪些,我可以查询所有用户的uppath字段中谁有我的id,我如何动态的查询伞下几级的所有人id呢
时间: 2024-03-21 10:42:01 浏览: 66
您可以使用 MySQL 中的 FIND_IN_SET 函数来实现动态查询伞下几级的所有人 id。具体步骤如下:
1. 假设您要查询的用户 ID 为 $userId,要查询的伞下级别为 $level。
2. 构造一个 SQL 语句,使用 FIND_IN_SET 函数查询 $userId 是否在所有用户的 uppath 字段中。
```
SELECT id, uppath FROM users WHERE FIND_IN_SET('$userId', uppath) > 0;
```
3. 遍历查询结果,将所有匹配的用户的 id 和 uppath 字段保存到一个数组中。
4. 遍历这个数组,对于每个匹配的用户,将其 uppath 字段按照逗号进行分割,取出分割后的数组中第 $level 个元素,即为该用户的 $level 级上级的 ID。
需要注意的是,如果您要查询伞下 $level 级的所有人,需要对步骤 4 进行递归,直到查询到 $level 级为止。同时,为了避免 SQL 注入,建议使用 PDO 或者 mysqli 进行参数绑定。
相关问题
你使用tp5 框架中的Db查询直接帮我写一下代码实现我的需求
好的,以下是使用 TP5 中的 Db 查询实现您的需求的示例代码:
```php
// 假设您要查询的用户 ID 为 $userId,要查询的伞下级别为 $level。
$userId = 1;
$level = 2;
// 构造查询条件,查询 uppath 字段中包含 $userId 的所有用户
$where = [
['exp', "FIND_IN_SET('$userId', uppath) > 0"]
];
// 查询所有匹配的用户的 id 和 uppath 字段
$users = Db::table('users')->field('id, uppath')->where($where)->select();
// 定义一个数组,用于保存查询结果
$result = [];
// 遍历所有匹配的用户
foreach ($users as $user) {
// 将当前用户的 id 和 uppath 字段保存到查询结果数组中
$result[$user['id']] = $user['uppath'];
// 分割 uppath 字段,取出第 $level 级上级的 id
$uppath = explode(',', $user['uppath']);
$upUserId = isset($uppath[$level - 1]) ? $uppath[$level - 1] : null;
// 如果存在上级用户,则递归查询其伞下级别为 $level - 1 的所有人,并将其结果合并到查询结果数组中
if ($upUserId) {
$subResult = $this->getSubUsers($upUserId, $level - 1);
$result = array_merge($result, $subResult);
}
}
// 打印查询结果
var_dump($result);
// 定义一个递归函数,用于查询某个用户的伞下级别为 $level 的所有人
function getSubUsers($userId, $level)
{
// 构造查询条件,查询 uppath 字段中包含 $userId 的所有用户
$where = [
['exp', "FIND_IN_SET('$userId', uppath) > 0"]
];
// 查询所有匹配的用户的 id 和 uppath 字段
$users = Db::table('users')->field('id, uppath')->where($where)->select();
// 定义一个数组,用于保存查询结果
$result = [];
// 遍历所有匹配的用户
foreach ($users as $user) {
// 将当前用户的 id 和 uppath 字段保存到查询结果数组中
$result[$user['id']] = $user['uppath'];
// 如果还未到达指定的级别,则递归查询其伞下级别为 $level - 1 的所有人,并将其结果合并到查询结果数组中
if ($level > 1) {
$subResult = $this->getSubUsers($user['id'], $level - 1);
$result = array_merge($result, $subResult);
}
}
// 返回查询结果数组
return $result;
}
```
需要注意的是,以上代码中的查询条件使用了 `exp` 方法,可以直接写原生的 SQL 表达式,因此可能存在 SQL 注入的风险。如果您需要避免这种风险,可以使用 TP5 中的参数绑定功能。
阅读全文