[英]Doctrine2: association mapping for a table with multiple foreign keys
我和我的一个朋友正在研究用于存储食谱的多语言网络应用程序。 我们使用Doctrine 2.1.1来实现持久性。 目前我卡住为一个实体生成模型,并希望有人可以给我一个提示,或者为我们的案例展示最佳实践。
我将尝试广泛地解释我们的ERD。 如果有什么难以理解的话,请随意询问。 我们的应用程序包含实体recipe
, ingredients
, units
(成分的度量单位)和categories
。 这些实体中的每一个都存储在自己的表中。 每个实体都可以用多种语言翻译。 翻译的存储位于名为(您的名字) translations
的表格中。 现在它会有点棘手......我们有一个名为mnemonic
的额外表格。 我们用它来识别全球背景下的食谱,成分,类别和测量单位......我认为最好的类比是GUID。 助记符还可以帮助我们在食谱,配料等及其翻译之间进行映射。 助记符表由五行组成: id
(主键)和另外四个元数据行: ingredient_id
, recipe_id
, category_id
和unit_id
引用与其亲属的主键的1:1关系。
我问自己,我如何映射助记实体和食谱,成分等之间的关系。 或者(更具体地说)如何使用category_id
表的主键值自动填充助记符表中的category_id?
我在我的Category模型中首先尝试了这种关联映射:
class Category
{
/**
* @var integer $id
*
* @Column(name="id", type="bigint", nullable=false)
* @Id
* @GeneratedValue(strategy="IDENTITY")
* @OneToOne(targetEntity="Mnemonic", mappedBy="category")
* @JoinColumn(name="id", referencedColumnName="category_id")
*/
private $id;
并在助记符模型中:
class Mnemonic
{
/**
*
* @OneToOne(targetEntity="Category", inversedBy="mnemonic")
* @JoinColumn(name="category_id", referencedColumnName="id")
*/
private $categoryId;
这没有成功 - Doctrine不会产生任何错误,但只填充类别表。 所以我想我可以在Category模型的__construct
方法中编写一些代码,在那里我将创建一个Mnemonic对象,根据Category模型的ID设置他的categoryId并将其绑定到doctrine的实体管理器。 但这有点难看 - 我认为模型类不应该对持久性负责。 在写我的问题时,我想,解决方案可能是一种工厂类。 它会将所有持久性逻辑从模型中删除,并可以处理特殊情况。
你怎么看? 什么是最好的解决方案?
最好的问候建议
保罗
您是否考虑过为onFlush添加事件监听器? 所以基本上在flush上,你检查你持久存在的对象,然后执行一些代码,比如创建Mnemonic
对象。
有关注册onFlush事件的信息可以在学说网站的以下链接中找到:
http://docs.doctrine-project.org/projects/doctrine-orm/en/2.0.x/reference/events.html#onflush
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.