Doctrine2 select 所有关联(来自查询的 JOINS)上的所有字段是否会填充完整的聚合对象?

Will Doctrine2 select all fields on all associations (JOINS from a query) to populate the full aggregate object?

我正在研究是否尝试 Doctrine2。让我害怕的一件事是我不需要的列的过度选择(即考虑不必要地选择了很多 varchars)。

您可能会问:但是您不想填充完整的实体对象吗?是的,除非我正在寻找阵列水合。但是,很多时候我不需要填充完整的聚合。采取如下所示的关联。如果我在地址上使用 JOIN 查询用户 table,地址 table 中的所有列是否也会被选择(因此填充到用户对象内的地址对象中)?现在假设我们有更多的 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 记录。

也就是说,性能方面最好 select 两个实体,这样 Doctrine 只会进行一次查询而不是 1+N 次查询