You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

获取Doctrine关联实体时如何避免大量查询?

Doctrine查询优化问题

之前从没在意过Doctrine生成的查询数量,直到今天,一个我觉得相当简单的任务居然跑了750次查询,耗时16秒……

初始控制器代码:

public function indexAction()
{
    $em = $this->em;

    $risks = $em->getRepository('App\Entity\Hazardlog\Risk')->findAll();

    // 筛选出属于当前版本分析的风险
    $risksCurrent = array();

    foreach($risks as $r) {
        if ($r->getAnalysis()->getCurrentVersion() == true) {
            $risksCurrent[] = $r;
        }               
    }

    return $this->render('risk/index.html.twig', array(
        'risks' => $risksCurrent,
    ));
}

我猜测循环的每一次迭代都会执行新的SQL查询。原本以为首次获取对象时就会拿到完整数据,之后访问属性不会触发数据库调用,结果完全想错了 =)

有没有不用写原生SQL的高效解决方法?我能用下面的SQL实现需求:

SELECT * FROM risk JOIN analysis ON risk.analysis = analysis.id WHERE (analysis.CurrentVersion = true)

但我更希望直接操作实体对象,而不是写SQL……


修改后的控制器代码:

public function indexAction()
{
    $em = $this->em;

    $query = $em->createQuery('SELECT * FROM risk JOIN analysis ON risk.analysis = analysis.id WHERE (analysis.CurrentVersion = true)');
    $risksCurrent = $query->getResult();

    return $this->render('risk/index.html.twig', array(
        'risks' => $risksCurrent,
    ));
}

改完之后查询次数降到了18次,耗时半秒,舒服多了……但我明明只写了一个查询,还是搞不懂为什么会有18次 😇

内容的提问来源于stack exchange,提问作者Matt Welander

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 17:24:47