获取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
相关产品推荐
相关产品推荐

