如何在 Doctrine2 中限制 OneToMany/ManyToOne 关联 depth/loop?

How to limit OneToMany/ManyToOne associations depth/loop in Doctrine2?

我有 3 个学说实体。第一个是 User,第二个是 Product,第三个是 ProductUsers.

因此,UserProductUsers 具有 OneToMany 关联,而 ProductProductUsers 具有 OneToMany 关联。 ProductUsersUserProduct 都有 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。哪个没有按预期工作,这不是解决我的问题的正确方法。所以我做了一些研发并想出了一个解决方案,我不需要从 ProductProductUsers.

bidirectional 关系

我只能从 ProductUsers 端管理与 unidirectional 处理相同的关系。当您需要 cascade-persist 或类似功能时,您将需要 One-To-Many 关联。我也写了一个关于这个的small blog

因此,对于您的解决方案,只需让 ProductUsersProductUser 实体建立 Many-To-One 关联。您不需要对数据库关联进行任何更改。

当您需要为单个用户关联产品时,您可以随时在存储库中保存一个 Querybuilder,以便在需要关联数据时使用。

这样会节省很多性能。希望对您有所帮助!