我有一个继承类,如下所示:
正如您可以很容易地看到用户、建筑物和旅馆有地址(不止一个)并且地址表在其列中保留所有者的 ID。
- 我的逻辑正确吗?
- 假设我想获取 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/