【发布时间】:2012-11-27 12:59:56
【问题描述】:
我正在加快使用 Symfony 2 和 Doctrine 的速度,并且在执行大量不必要的数据库查找以与连接的实体进行水合时遇到困难。
在使用子对象执行联合查询后,子对象会自动从数据库中提取其其他映射。尽管我没有尝试访问它的任何属性,但它正在这样做。就好像它们在 find 查询中被访问。
我的示例如下所示 - 名为 Person 和 Building 的实体都加入了名为 Place 的实体:
class Person {
/**
* Where this person lives
* @var Place $Home
*
* @ORM\OneToOne(targetEntity="Place", cascade={"persist"}, inversedBy="Resident" )
* @ORM\JoinColumn(name="place_id", referencedColumnName="id")
*/
private $Home;
}
class Building {
/**
* Where this building stands
* @var Place $Site
*
* @ORM\OneToOne(targetEntity="Place", cascade={"persist"}, inversedBy="Landmark" )
* @ORM\JoinColumn(name="place_id", referencedColumnName="id")
*/
private $Site;
}
class Place {
/**
* Reverse mapping
* @var Person $Resident
*
* @ORM\OneToOne(targetEntity="Person", mappedBy="Home")
*/
private $Resident;
/**
* Reverse mapping
* @var Building $Landmark
*
* @ORM\OneToOne(targetEntity="Building", mappedBy="Site")
*/
private $Landmark;
}
我的 Person 存储库连接如下所示:
/**
* @override
* @return Person
*/
public function find( $id ){
$query = $this->getEntityManager()
->createQuery('
SELECT p, h
FROM MyBundle:Person p
JOIN p.Home h
WHERE p.id = :id'
)->setParameter('id', $id);
return $query->getSingleResult();
}
如何防止 Place 在 find 操作期间单独获取其 Building 关系?有什么我可以传递给 Query 实例来阻止这种情况的吗?
【问题讨论】:
-
我上传了一个示例包。如果没有人可以复制此错误,那么我的设置一定有问题。 static.timwhitlock.info/MyExampleBundle.tar.gz
-
我可以通过在查询中设置这个来防止自动获取:
$query->setHint( Query::HINT_FORCE_PARTIAL_LOAD, true );问题是当我确实想要它时它会杀死延迟加载。