如何在Doctrine2中限制OneToMany / ManyToOne关联深度/循环?

时间:2016-08-06 06:01:05

标签: symfony doctrine-orm doctrine associations model-associations

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

因此,UserOneToManyProductUsers个关联,同一ProductProductUsers有OneToMany关联。 ProductUsersManyToOneUser都有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所做的那样。有没有办法限制学说中的这种开销?

1 个答案:

答案 0 :(得分:2)

我很久以前就遇到过这个问题。我试过了lazy loading。哪个没有按预期工作,这不是我的问题的正确解决方案。所以我做了一些R& D并提出了一个解决方案,我不需要bidirectionalProduct之间的ProductUsers关系。

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

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

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

它将节省很多性能。希望它有所帮助!