我正在研究是否尝试使用Doctrine2。令我恐惧的一件事是我不需要的列的过度选择(即,考虑不必要地选择了许多varchars)。
您可能会问:但是您不想要填充完整的实体对象吗?是的,除非我要寻找阵列补水。但是,很多时候我不需要完全聚合。采取以下所示的关联。如果我使用在地址上的JOIN查询用户表,那么地址表中的所有列也会被选择(并因此填充到用户对象内部的地址对象中)吗?现在想象我们有更多的联接。这可能真的很糟糕。如果我只希望仅在仅用户对象中填充“用户”中的字段,该怎么办?我想我对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-> getAddress()获得关联的记录时,Doctrine将即时进行查询并为您添加地址记录。
也就是说,从性能角度考虑,最好同时选择两个实体,以便Doctrine仅执行一个查询,而不执行1 + N个查询
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句