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



我正在研究是否尝试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个查询

相关内容

  • 没有找到相关文章

最新更新