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