Doctrtrine2会选择所有关联的所有字段(来自查询的JOINS)来填充完整的聚合对象吗?

时间:2015-03-20 02:56:22

标签: doctrine-orm aggregation

我正在研究是否尝试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)?

1 个答案:

答案 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次查询