我正在研究是否尝试Doctrine2。有一件事让我害怕,那就是过度选择我不需要的列(即,考虑不必要地选择了很多varchars)。
您可能会问:,但您不想填充完整的实体对象吗是的,除非我在找阵列补水。然而,很多时候我不需要完整的聚合填充。以下面显示的关联为例。如果我用地址上的JOIN查询Users表,地址表中的所有列也会被选择吗(因此会被填充到Users对象内部的地址对象中)?现在假设我们有更多的JOIN。这可能会变得非常糟糕。如果我只想在一个仅限用户的对象中填充User中的字段,该怎么办?我想我有点困惑于Doctrine在幕后对关联和查询JOIN做了什么。
/** @Entity **/
class User
{
// ...
/**
* @ManyToOne(targetEntity="Address")
* @JoinColumn(name="address_id", referencedColumnName="id")
**/
private $address;
}
/** @Entity **/
class Address
{
// ...
}
那么,Doctrine2是否在查询后填充聚合中所有对象的所有字段(除非我指定partial
)?
这取决于您的查询,但通常不是隐式的。使用查询生成器,您可以获取如下相关记录:
<?php
$qb = $em->createQueryBuilder();
$query = $qb->select(array("u", "a"))
->from("User", "u")
->innerJoin("u.address", "a")
->getQuery();
在select()语句中,您可以指定要获取的内容,在这种情况下,您可以同时获取两者。
如果您只获取User记录,那么当您使用$User->getAddress()获取相关记录时,Doctrine将动态查询并为您水合Address记录。
也就是说,在性能方面,最好同时选择两个实体,这样Doctrine将只进行一个查询,而不是1+N个查询