php - 使用继承访问表的关系

标签 php doctrine-orm

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

Relations

正如您可以很容易地看到用户、建筑物和旅馆有地址(不止一个)并且地址表在其列中保留所有者的 ID。

  1. 我的逻辑正确吗?
  2. 假设我想获取 ID 为 2 的用户(或建筑物或旅馆)的地址;我必须运行 DQL 语句(以及如何运行?)还是可以在没有 DQL 的情况下使用 find() 函数获取它?

如果你举个例子我会很高兴,因为 Doctrine 文档帮不上什么忙。

谢谢。

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

编辑 2:我想我没说清楚,当我谈论类表继承时,我的意思是实体类的鉴别器列为

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

每个子类都与父类(实体)相关,外键关系为“id”。但当然,教义已经为我创造了这种关系。

最佳答案

通常地址是一个典型的value object .值对象通常与组成值对象的实体一起存储,因此它既不涉及关系也不涉及类表继承。如果您的域另有指示(例如,您可以对您的地址做一些事情,意思是),它们可能是一个实体,而不是实体 Hotel 拥有一个实体 Address(保存在 n: m 关系表)和实体 Building 也包含 Address(在不同的 n:m 关系表中)。

如果你走值(value)对象路线,事情就不同了。您可以将地址与 Building 实体以及 Hotel 实体一起存储(就像您对其他值对象所做的那样,它可能是 Money电子邮件密码)。所以你根本不需要关系,只需要多几个字段。 Doctrine 2 的问题是,它不支持 Component mapping .组件映射将用于很好地存储值对象。要用 Doctrine 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 值对象,您可能希望将序列化代码提取到一个单独的类中。

关于php - 使用继承访问表的关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6553139/

相关文章:

database - 来自现有数据库的 Symfony2 Doctrine2 映射(异常(exception))

php - 从 article_id = 的文章中删除限制?

symfony - 如何通过实体管理器获取上一个和下一个实体

php - 如何使用 doctrine/symfony4 从数据库中获取(加入)两条记录

php adodb StartTrans() 不工作?

php - 如何从 CakePHP 中的 Controller 访问助手?

php - Carbon::isoFormat 不存在

php - 上传文件大小

php - 标签系统使用什么样的表?

php - Doctrine2 order by count many to many with many left join