thinkphp 5.1 后台批量启用记录时,先验证选中 id,再在一条更新语句里限定管理范围和原状态。重复选中同一 id 只更新一次,已经启用的记录也不会再次计数。
用 POST 提交选中的记录
示例已有管理员认证、CSRF 验证和组织授权。items 表含 id、organization_id、status,状态 0 为停用、1 为启用。
{
"ids": [12, 15, 15]
}
调用方将已授权的组织 ID 交给下面的业务方法。组织 ID 从服务端上下文取得。
校验 ID 后执行条件更新
把下面方法放进现有后台服务类,调用层把 InvalidArgumentException 映射为参数错误。
立即学习“PHP免费学习笔记(深入)”;
public function enableItems(int $organizationId, array $rawIds): int
{
if (count($rawIds) < 1 || count($rawIds) > 100) {
throw new \InvalidArgumentException('选择 1 到 100 条记录');
}
$ids = [];
foreach ($rawIds as $rawId) {
$id = filter_var($rawId, FILTER_VALIDATE_INT, [
'options' => ['min_range' => 1],
]);
if ($id === false || (!is_int($rawId) && !is_string($rawId))) {
throw new \InvalidArgumentException('记录 ID 必须是正整数');
}
$ids[] = $id;
}
return \think\Db::name('items')
->where('organization_id', $organizationId)
->where('id', 'in', array_values(array_unique($ids)))
->where('status', 0)
->update(['status' => 1]);
}返回值是实际更新的记录数。若同组织内还有逐条权限,先计算允许操作的 ID,再把该限制加入查询。
验证重复 ID 和跨组织记录
在测试库准备一条本组织停用记录、一条已启用记录和一条其他组织停用记录。
提交 [12, 12, 15, 20] -> 仅本组织停用记录发生变化 再次提交同一列表 -> 更新 0 条 提交 [] -> 参数错误
列表刷新后检查状态和数量。响应应描述实际更新数,方便识别无变化的请求。



















