如何在 Doctrine2 中限制 OneToMany/ManyToOne 关联 depth/loop?
How to limit OneToMany/ManyToOne associations depth/loop in Doctrine2?
我有 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
那样在条令层面限制它。有没有办法限制教义中的这种开销?
很久以前我就遇到过这个问题。我试过了lazy loading
。哪个没有按预期工作,这不是解决我的问题的正确方法。所以我做了一些研发并想出了一个解决方案,我不需要从 Product
到 ProductUsers
.
的 bidirectional
关系
我只能从 ProductUsers
端管理与 unidirectional
处理相同的关系。当您需要 cascade-persist
或类似功能时,您将需要 One-To-Many
关联。我也写了一个关于这个的small blog。
因此,对于您的解决方案,只需让 ProductUsers
与 Product
和 User
实体建立 Many-To-One
关联。您不需要对数据库关联进行任何更改。
当您需要为单个用户关联产品时,您可以随时在存储库中保存一个 Querybuilder
,以便在需要关联数据时使用。
这样会节省很多性能。希望对您有所帮助!
我有 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
那样在条令层面限制它。有没有办法限制教义中的这种开销?
很久以前我就遇到过这个问题。我试过了lazy loading
。哪个没有按预期工作,这不是解决我的问题的正确方法。所以我做了一些研发并想出了一个解决方案,我不需要从 Product
到 ProductUsers
.
bidirectional
关系
我只能从 ProductUsers
端管理与 unidirectional
处理相同的关系。当您需要 cascade-persist
或类似功能时,您将需要 One-To-Many
关联。我也写了一个关于这个的small blog。
因此,对于您的解决方案,只需让 ProductUsers
与 Product
和 User
实体建立 Many-To-One
关联。您不需要对数据库关联进行任何更改。
当您需要为单个用户关联产品时,您可以随时在存储库中保存一个 Querybuilder
,以便在需要关联数据时使用。
这样会节省很多性能。希望对您有所帮助!