【发布时间】:2016-12-12 13:37:04
【问题描述】:
我有 3 个教义实体。一个是User,第二个是Product,第三个是ProductUsers。
因此,User 与 ProductUsers 具有 OneToMany 关联,并且相同的 Product 与 ProductUsers 具有 OneToMany 关联。 ProductUsers 与 User 和 Product 有 ManyToOne 关联。像这样:
class Product
{
/**
* @var ProductUsers
*
* @ORM\OneToMany(targetEntity="ProductUsers", mappedBy="product")
*/
private $productUsers;
}
class ProductUsers
{
/**
* @var Product
*
* @ORM\Id
* @ORM\ManyToOne(targetEntity="Product", inversedBy="productUsers")
* @ORM\JoinColumn(name="product_ID", referencedColumnName="ID")
*/
private $product;
/**
* @var User
*
* @ORM\Id
* @ORM\ManyToOne(targetEntity="User", inversedBy="productUsers")
* @ORM\JoinColumn(name="user_ID", referencedColumnName="ID")
*/
private $user;
// extra fields ...
}
class User
{
/**
* @var ProductUsers
*
* @ORM\OneToMany(targetEntity="ProductUsers", mappedBy="user")
*/
private $productUsers;
}
一个用户可以使用多个产品,一个产品可以有多个用户。 ProductUsers 有一些关于关系的额外信息,而不仅仅是关系。
问题是当我获取一个User 对象时,它带有关联的ProductUsers,并且它关联了Product。不仅如此,Product 还附带所有与 ProductUsers 相关联的 User 对象,这是相当大的开销。
This问题与我的问题密切相关。
我希望像 JMSSerializerBundle MaxDepth 那样在教义层面限制这一点。有没有办法在学说中限制这种开销?
【问题讨论】:
-
这就是 Doctrine 的运作方式。您获得的集合应该是惰性集合,即只有当您访问底层数据时,才会从数据库中获取实际数据。默认情况下,当获取用户时,只会运行 SELECT * FROM users 查询。要一次获取记录(不是懒惰),您需要将它们加入 ORM 查询选择:$qb->select('u', 'up')
标签: symfony doctrine-orm doctrine associations model-associations