我和我的一位朋友正在开发一个用于存储食谱的多语言网络应用程序。我们使用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
?
我在我的分类模型中首先尝试了这种关联映射:
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的实体管理器。但这有点难看 - 我认为模型类不应该对持久性负责。
在写我的问题时,我想,解决方案可能是一种工厂类。它会将所有持久性逻辑从模型中删除,并可以处理特殊情况。
最好的咨询意见
保
答案 0 :(得分:1)
您是否考虑过为onFlush添加事件监听器?所以基本上在flush上,你检查你持久存在的对象,然后执行一些代码,比如创建Mnemonic
对象。
有关注册onFlush事件的信息可以在学说网站上找到以下链接:
http://docs.doctrine-project.org/projects/doctrine-orm/en/2.0.x/reference/events.html#onflush