【发布时间】:2013-01-08 07:34:38
【问题描述】:
在一个项目中,我有一个通用的Meta 表,任何其他表都可以使用它来存储其他数据。
元表有一个 (target_type, target_id) 列对,它们引用外部表和元条目所涉及的外键。
例如
- 用户表的元条目将具有 (target_type, target_id) = ('users', 53)
- donkeys 表的元条目将具有 (target_type, target_id) = ('donkeys', 25)
Meta 的架构如下所示:
<table name="meta" phpName="Meta">
<column name="id" type="integer" required="true" primaryKey="true" autoIncrement="true"/>
<column name="target_id" type="integer" required="true" />
<column name="target_type" type="varchar" size="50" required="true" />
<column name="code" type="varchar" size="50" required="true" />
<column name="value" type="varchar" required="true" />
</table>
我知道我可以使用外键在 donkeys 表中设置与 Meta 表的关系,如下所示:
<table name="donkeys" phpName="Donkey">
/* ... */
<foreign-key foreignTable="meta">
<reference local="id" foreign="target_id"/>
</foreign-key>
</table>
但这并不能满足在该关系中应将target_type 设置为donkeys 的附加条件。
所以 $donkey->getMeta() 实际上可能会返回与驴无关的 Meta 信息!
我看不到在架构的外键声明中设置附加条件的方法。 对吗?
我认为也许继承可以解决这个问题,所以我将元模式更改为:
<table name="meta" phpName="Meta">
<column name="id" type="integer" required="true" primaryKey="true" autoIncrement="true"/>
<column name="target_id" type="integer" required="true" />
<column name="target_type" type="varchar" size="50" required="true" inheritance="single">
<inheritance key="users" class="UserMeta"/>
<inheritance key="donkeys" class="DonkeyMeta"/>
</column>
<column name="code" type="varchar" size="50" required="true" />
<column name="value" type="varchar" required="true" />
</table>
但我似乎无法在外键中设置关系以链接到继承的子类 DonkeyMeta。
即这不起作用:
<table name="donkeys" phpName="Donkey">
/* ... */
<foreign-key foreignTable="DonkeyMeta">
<reference local="id" foreign="target_id"/>
</foreign-key>
</table>
有没有办法用推进模式建立这种关系?
【问题讨论】:
标签: php inheritance schema propel