我正在研究是否尝试Doctrine2。令我害怕的一件事是过度选择我不需要的列(即考虑不必要地选择大量的varchars)。
您可能会问:但是您不希望您的完整实体对象被填满吗?是的,除非我正在寻找阵列水合作用。但是,很多时候我不需要填充完整的聚合。采取如下所示的关联。如果我在地址表上使用JOIN查询Users表,那么地址表中的所有列也将被选中(因此填充到用户对象内的地址对象中)?现在想象我们有更多的JOIN。这可能会变得非常糟糕。如果我只希望用户填充的字段只是一个用户对象,该怎么办?我想我对Doctrine在关联和查询JOIN的幕后做的事情感到有些困惑。
/** @Entity **/
class User
{
// ...
/**
* @ManyToOne(targetEntity="Address")
* @JoinColumn(name="address_id", referencedColumnName="id")
**/
private $address;
}
/** @Entity **/
class Address
{
// ...
}
在查询之后,Doctrine2是否会填充聚合中所有对象的所有字段(除非我指定partial
)?
答案 0 :(得分:1)
这取决于您的查询,但通常不是隐含的。 使用查询构建器,您可以像这样获取关联的记录:
<?php
$qb = $em->createQueryBuilder();
$query = $qb->select(array("u", "a"))
->from("User", "u")
->innerJoin("u.address", "a")
->getQuery();
在select()语句中指定要获取的内容,在这种情况下,您可以同时获取两者。
如果您只获取用户记录,那么当您使用$ user-&gt; getAddress()获取相关记录时,Doctrine将立即进行查询并为您提供地址记录。
那就说性能明智,最好选择两个实体,这样Doctrine只会进行一次查询而不是1 + N次查询