Php 使用继承访问表的关系

Php 使用继承访问表的关系,php,doctrine-orm,Php,Doctrine Orm,我有一个继承类,如下所示: 您可以很容易地看到用户、建筑物和酒店都有地址(不止一个),地址表在其列中保留所有者的id 我的逻辑正确吗 假设我想获得id为2的用户(或建筑物或酒店)的地址;我必须运行DQL语句(以及如何运行?),还是可以在没有DQL的情况下使用find()函数获得它 如果你举个例子,我会很高兴,因为条令文档并没有多大帮助 谢谢 编辑:用户、建筑物和酒店只是符号名称,这就是为什么它们可以有多个地址,否则建筑物和酒店将只有一个地址 编辑2:我想我说不清楚,当我谈到类表继承时,我的意思

我有一个继承类,如下所示:

您可以很容易地看到用户、建筑物和酒店都有地址(不止一个),地址表在其列中保留所有者的id

  • 我的逻辑正确吗
  • 假设我想获得id为2的用户(或建筑物或酒店)的地址;我必须运行DQL语句(以及如何运行?),还是可以在没有DQL的情况下使用
    find()
    函数获得它
  • 如果你举个例子,我会很高兴,因为条令文档并没有多大帮助

    谢谢

    编辑:用户、建筑物和酒店只是符号名称,这就是为什么它们可以有多个地址,否则建筑物和酒店将只有一个地址

    编辑2:我想我说不清楚,当我谈到类表继承时,我的意思是实体类的Discriminator列为

    /**
     * ...
     *
     * @DiscriminatorColumn(name="classname", type="string")
     * @DiscriminatorMap({"Entities\users" = "Entities\users",
     * "Entities\buildings" = "Entities\buildings"}) ... etc
     */
    

    每个子类都和父(实体)相关,外键关系为“id”。当然,条令已经为我创建了这种关系。

    所以你有一个名为“实体”的超类,它有子类“用户”、“建筑”和“酒店”

    您的“实体”实体应与地址具有一对一关系。让我们想象一下,在实体定义中,它是这样的:

    /**
     * @OneToMany(targetEntity="Address", mappedBy="whose"
     */
    protected $addresses;
    
    这或多或少是一种很好的方法,尽管使用继承有点难闻

    然后,如果要从用户、建筑或酒店内部迭代地址,请执行以下操作:

    foreach($this->addresses as $address){
        //do something with adderess
    }
    

    这回答了你的问题吗?

    通常地址是一个典型的地址。值对象通常与组成值对象的实体一起存储,因此它既不涉及关系,也不涉及类表继承。如果您的域另有指示(例如,您可以对您的地址做一些事情,意思),则它们可能是一个实体,而不是实体<代码>酒店<代码>持有一个实体<代码>地址<代码>(保存在n:m关系表中),实体<代码>建筑<代码>也持有和<代码>地址<代码>(在不同的n:m关系表中)

    如果你走价值对象路线,事情就不同了。您可以将地址存储在
    建筑
    实体以及
    酒店
    实体中(就像您存储其他价值对象时一样,可能是
    货币
    电子邮件
    密码
    )。所以你根本不需要关系,只需要几个字段。第2条原则的问题是,它不支持。组件映射将用于很好地存储值对象。如果你不能用条令2完成同样的事情,你将实现一个
    @prePersist
    和一个
    @postLoad
    处理程序,如下所示:

    class Hotel
    {
        private ;
    
        /** These fields are persisted */
    
        /** @Column(type=string) */
        private $addressStreet;
        /** @Column(type=string) */
        private $addressCity;
        /** @Column(type=string) */
        private $addressZip;
        /** @Column(type=string) */
        private $addressCountry;
    
        /** @prePersist */
        public function serializeValueObjects()
        {
            $this->addressStreet = ->address->getStreet();
            $this->addressCity = ->address->getCity();
            $this->addressZip = ->address->getZip();
            $this->addressCountry = ->address->getCountry();
        }
    
    
        public function unserializeValueObjects()
        {
            $this->address = new Address(->addressStreet, ->addressCity, ->addressZip, ->addressCountry);
        }
    }
    
    由于需要在不同的位置序列化/取消序列化
    Address
    值对象,因此可能需要将序列化代码提取到一个单独的类中

    /** * * @Entity * @Table(name="proposaltemplate") * @InheritanceType("JOINED") * @DiscriminatorColumn(name="entitytype", type="string") * @DiscriminatorMap({"proposal" = "ProposalTemplate","page" = "PageTemplate"}) * */ abstract class AbstractProposalTemplate { /** * * @var integer * @Id * @Column(type="integer") * @generatedValue(strategy="AUTO") * */ private $id; } next @Entity class ProposalTemplate extends AbstractProposalTemplate { @Id @Column(type="integer") @generatedValue(strategy="AUTO") private $id; } next another class @Entity class PageTemplate extends AbstractProposalTemplate { /** * * @var integer * @Id * @Column(type="integer") * @generatedValue(strategy="AUTO") * */ private $id; } /** * *@实体 *@Table(name=“proposaltemplate”) *@InheritanceType(“已加入”) *@DiscriminatorColumn(name=“entitytype”,type=“string”) *@DiscriminatorMap({“proposal”=“ProposalTemplate”,“page”=“PageTemplate”}) * */ 抽象类AbstractProposalTemplate { /** * *@var整数 *@Id *@Column(type=“integer”) *@generatedValue(strategy=“AUTO”) * */ 私人$id; } 下一个 @实体 类ProposalTemplate扩展了AbstractProposalTemplate { @身份证 @列(type=“integer”) @生成值(策略=“自动”) 私人$id; } 下一节课 @实体 类PageTemplate扩展AbstractProposalTemplate { /** * *@var整数 *@Id *@Column(type=“integer”) *@generatedValue(strategy=“AUTO”) * */ 私人$id; }
    如果每一个物体都有自己的街道、国家、拉链等,这不会有任何好处。这与类表继承无关。我编辑这个问题是为了更好地解释它,你可能想看看。无论如何,谢谢你。