我有 3 个 Doctrine 实体。第一个是 User
,第二个是 Product
,第三个是 ProductUsers
。
因此,User
与 ProductUsers
具有 OneToMany
关联,并且相同的 Product
与 具有 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问题与我的问题密切相关。
我希望在 Doctrine 级别限制这一点,就像 JMSSerializerBundle MaxDepth
所做的那样。有没有办法限制这种 Doctrine 上的开销?
最佳答案
我很久以前就遇到过这个问题。我试过lazy loading
。这没有按预期工作,这也不是解决我的问题的正确方法。所以我做了一些研发并想出了一个我不需要 bidirectional
的解决方案关系来自Product
至ProductUsers
.
我可以与 unidirectional
管理相同的关系仅处理 ProductUsers
边。您将需要One-To-Many
当您需要时关联cascade-persist
或类似的功能。我写了一个small blog关于这一点也是如此。
因此,对于您的解决方案,只需 Many-To-One
关联来自ProductUsers
两者都有 Product
和User
实体。您不需要对数据库关联进行任何更改。
当您需要为单个用户关联产品时,您可以随时保存 Querybuilder
在存储库中,以便在需要关联数据时使用。
它将节省大量性能。希望对您有帮助!
关于symfony - 如何限制 Doctrine2 中的 OneToMany/ManyToOne 关联深度/循环?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38801062/