Doctrine|ORM|Symfony:可能与接口或多个实体有关系

Posted

技术标签:

【中文标题】Doctrine|ORM|Symfony:可能与接口或多个实体有关系【英文标题】:Doctrine|ORM|Symfony: Is possible relation to Interface or multiple entities 【发布时间】:2021-02-23 09:40:07 【问题描述】:

简单示例: 我有两个用户 Admin 和 Client(都实现了 UserInterface)和 Cart - 三个实体类。管理员和客户可以拥有自己的购物车。如何配置/解析购物车实体关系以具有返回管理员或客户端用户的方法“getUser()”?

也许我可以在购物车中拥有 user_id 列和带有用户实体名称的第二列(类似于 DiscriminatorMapping 可以做的事情)?

    class Admin implements UserInterface
    

    /**
     * @ORM\Id()
     * @ORM\GeneratedValue()
     * @ORM\Column(type="integer")
     */
    private $id;
    
    /**
     * @var Collection
     * @ORM\OneToMany(targetEntity="Cart", mappedBy="???")
     */
    private $carts;
    ....
    class Client implements UserInterface
    

    /**
     * @ORM\Id()
     * @ORM\GeneratedValue()
     * @ORM\Column(type="integer")
     */
    private $id;
    
    /**
     * @var Collection
     * @ORM\OneToMany(targetEntity="Cart", mappedBy="???")
     */
    private $carts;
    ....
    class Cart
    

    /**
     * @ORM\Id()
     * @ORM\GeneratedValue()
     * @ORM\Column(type="integer")
     */
    private $id;
    
    /**
     * @var UserInterface
     * @ORM\ManyToOne(targetEntity="UserInterface", ???)
     */
    private $user;
    ....

我尝试了this Doctrine 功能,还尝试了DisciminatorMapping 和复合键(多列连接)选项,但没有成功。

有什么帮助吗?

【问题讨论】:

【参考方案1】:

我想你快到了。 DiscriminatorMapping 可能是要走的路。但是,您需要将 Client 和 Admin 绑定到 Parent 类。所以考虑这个层次结构:

用户(父类)

管理员(扩展用户) 客户端(扩展用户)

然后在您的购物车实体中将关系绑定到用户实体。

【讨论】:

以上是关于Doctrine|ORM|Symfony:可能与接口或多个实体有关系的主要内容,如果未能解决你的问题,请参考以下文章

如何通过 SonataAdminBundle (Symfony) 管理 Doctrine ORM 类表继承?

级联持久性不工作(Doctrine ORM + Symfony 2)

如何在 symfony 中更新新版本的 Doctrine2 和 ORM?

Symfony 3 Doctrine MySQL - 使用 @ORM 注释生成实体

Symfony2 Doctrine ORM 安装配置

ORM Doctrine ManyToOne on update CASCADE (Symfony)