我是3个学说实体。一个是User
,第二个是Product
,第三个是ProductUsers
。
因此,User
与OneToMany
有ProductUsers
个关联,同一Product
与ProductUsers
有OneToMany关联。 ProductUsers
与ManyToOne
和User
都有Product
个关联。像这样:
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
所做的那样。有没有办法限制学说中的这种开销?
答案 0 :(得分:2)
我很久以前就遇到过这个问题。我试过了lazy loading
。哪个没有按预期工作,这不是我的问题的正确解决方案。所以我做了一些R& D并提出了一个解决方案,我不需要bidirectional
到Product
之间的ProductUsers
关系。
我只能从unidirectional
方处理ProductUsers
处理相同的关系。当您需要One-To-Many
或类似功能时,您需要cascade-persist
关联。我也写了small blog。
因此,对于您的解决方案,只需Many-To-One
与ProductUsers
和Product
实体的User
关联。您不需要对数据库关联进行任何更改。
当您需要与单个用户关联的产品时,您始终可以在存储库中保存Querybuilder
,以便在需要关联数据时使用。
它将节省很多性能。希望它有所帮助!