Php 使用继承访问表的关系
我有一个继承类,如下所示: 您可以很容易地看到用户、建筑物和酒店都有地址(不止一个),地址表在其列中保留所有者的idPhp 使用继承访问表的关系,php,doctrine-orm,Php,Doctrine Orm,我有一个继承类,如下所示: 您可以很容易地看到用户、建筑物和酒店都有地址(不止一个),地址表在其列中保留所有者的id 我的逻辑正确吗 假设我想获得id为2的用户(或建筑物或酒店)的地址;我必须运行DQL语句(以及如何运行?),还是可以在没有DQL的情况下使用find()函数获得它 如果你举个例子,我会很高兴,因为条令文档并没有多大帮助 谢谢 编辑:用户、建筑物和酒店只是符号名称,这就是为什么它们可以有多个地址,否则建筑物和酒店将只有一个地址 编辑2:我想我说不清楚,当我谈到类表继承时,我的意思
find()
函数获得它/**
* ...
*
* @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;
}
如果每一个物体都有自己的街道、国家、拉链等,这不会有任何好处。这与类表继承无关。我编辑这个问题是为了更好地解释它,你可能想看看。无论如何,谢谢你。