【发布时间】:2016-03-27 23:21:19
【问题描述】:
我有以下数据库结构(简化)。所有关系都是多对一。
父表:
ID | SOME_DATA
-------------------------------
1 | Lorum
2 | Ipsum
..etc
表子:
ID | PARENT_ID | SOME_DATA
-------------------------------
1 | 2 | Dolor
2 | 5 | Sis
..etc
使用正常的学说方法将它们全部显示在一个页面上:
<?php
//get parents
$parents = $this->getDoctrine()->getRepository('FamilyBundle:Parent')->findAll();
//loop through parents
foreach($parents AS $parent){
//display parent
echo '<h1>'.$parent->getName().'</h1>';
//show children
foreach($parent->getChildren() AS $child)
echo '<h2>'.$child->getName().'</h2>';
}
使用首发工具时,我惊讶地发现为了检索子实体,对每个父实体都使用了一个新的数据库查询。导致脚本效率非常低。
上面的例子是简化的。如果我不依赖实体类中的某些专门方法,我可以使用 原始查询。 所以我的问题是,有没有办法进行更智能的查询,但仍然能够使用学说实体管理器管理数据,以便我仍然可以访问实体类方法。 最好,我会喜欢指定预加载父实体的哪些子实体,因为我不需要使用所有子实体。
谁能指出我正确的方向?
【问题讨论】:
-
使用查询构建器或 DQL 查询来获取您需要的实体,您在查询中加入的关系将被加载,这样您就可以避免在循环中延迟加载等问题。
标签: php symfony doctrine-orm doctrine