tp3.1临时连接指定数据库,切片分类in查询,带过滤需要的数据

最近写了一段比较不错的代码,记录一下,tp3.1临时连接指定数据库,切片分类in查询,带过滤需要的数据

php 复制代码
/**
     * 获取季度报告总结
     * @author Bruce 2025/6/10
     */
    public function getQuarterReportSummarize() {
        // 获取全部数据
        $allData = $this->getAllProtectedDomains();

        if ($allData['code'] != 1) {
            return $this->ajaxError($allData['message']);
        }

        // 分批处理大量数据,每批500个
        $batchSize = 500;
        $result = [];
        $totalDomains = count($allData['list']);

        for ($i = 0; $i < $totalDomains; $i += $batchSize) {
            $batch = array_slice($allData['list'], $i, $batchSize);
            $configs = D('WangZhanDomainHost')->getConfigs($batch);

            foreach ($configs as $key=>$config) {
                $messages = [];
                if (!$config['iswaf']) $messages[] = 'Web漏洞防护未开启';
                if (!$config['cc_switch']) $messages[] = 'CC防护未开启';
                if (!$config['cs_switch']) $messages[] = '爬虫防护未开启';

                if (!empty($messages)) {
                    $result[$key] = implode(',', $messages) . ';';
                }
            }

            // 释放内存
            unset($batch, $configs);
        }

        return $this->ajaxSuccess($result);
    }
php 复制代码
# WangZhanDomainHostModel.class.php
/**
     * 获取配置信息(优化版)
     */
    public function getConfigs($data = [])
    {
        if (empty($data)) return [];

        // 提取所有host和zone组合
        $hosts = [];
        $zones = [];
        $hostZoneMap = [];

        foreach ($data as $item) {
            if (empty($item['host']) || empty($item['zone'])) continue;

            $host = addslashes($item['host']);
            $zone = addslashes($item['zone']);

            $hosts[$host] = $host;
            $zones[$zone] = $zone;
            $hostZoneMap[$host][$zone] = true;
        }

        if (empty($hosts) || empty($zones)) return [];

        // 使用IN查询替代大量OR条件
        $allConfigs = $this->alias('dh')
            ->join('LEFT JOIN anti_cc_config cc ON dh.host = cc.host AND dh.zone = cc.zone')
            ->join('LEFT JOIN anti_cs_config cs ON dh.host = cs.host AND dh.zone = cs.zone')
            ->where([
                'dh.host' => ['IN', array_unique($hosts)],
                'dh.zone' => ['IN', array_unique($zones)],
            ])
            ->field('dh.host, dh.zone, 
                IFNULL(dh.iswaf, 0) as iswaf,
                IFNULL(cc.main_switch, 0) as cc_switch,
                IFNULL(cs.main_switch, 0) as cs_switch')
            ->select();

        // 过滤出真正需要的记录
        $finalConfigs = [];
        foreach ($allConfigs as $config) {
            if (isset($hostZoneMap[$config['host']][$config['zone']])) {
                $finalConfigs[$config['host'].'.'.$config['zone']] = $config;
            }
        }

        return $finalConfigs;
    }
相关推荐
treacle田21 分钟前
达梦数据库-达梦数据库中link链接访问远程Sql Sever-记录总结
数据库·达梦-sqlserver
ClouGence22 分钟前
不用搭复杂系统,也能做跨地域数据迁移?
大数据·数据库·saas
IT枫斗者23 分钟前
构建具有执行功能的 AI Agent:基于工作记忆的任务规划与元认知监控架构
android·前端·vue.js·spring boot·后端·架构
xcjbqd025 分钟前
SQL中视图能否嵌套存储过程_实现复杂自动化报表逻辑
jvm·数据库·python
听*雨声37 分钟前
软件设计师上午题5:数据库
数据库
用户693717500138444 分钟前
XChat 为什么选择 Rust 语言开发
android·前端·ios
hong78171 小时前
阿里coding plan qwen3.6-plus 不支持图片上下文长度只有200K,问题出在哪?
linux·运维·数据库
林栩link1 小时前
【车载 Android】实践跨进程 UI 融合渲染
android
Paxon Zhang1 小时前
MySQL 大师之路**数据库约束,表设计,CRUD**
android·数据库·mysql
HealthScience1 小时前
clinvar数据集说明
数据库·oracle