有没有办法在推进中使用单个继承表作为外键表?

时间:2012-02-28 06:54:50

标签: php inheritance schema propel

在一个项目中,我有一个通用的Meta表,任何其他表都可以用来存储其他数据。

Meta表有一对(target_type,target_id)列,它们引用外部表和元条目所涉及的外键。

e.g。

  • users表的元条目将具有(target_type,target_id)=('users',53)
  • 驴表的元条目有(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>

我知道我可以使用外键来设置驴表中的关系 Meta 表,如下所示:

<table name="donkeys" phpName="Donkey">
    /* ...  */
    <foreign-key foreignTable="meta">  
        <reference local="id" foreign="target_id"/>  
    </foreign-key> 
</table>

但这并不能完全满足target_type在该关系中donkeys应设置的附加条件。

所以$ donkey-&gt; 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>

是否有办法与推进模式建立这种关系?

1 个答案:

答案 0 :(得分:1)

不幸的是,没有。我已经实现了与你相同的设置,并且我已经向Propel的创建者询问了同样的事情(他对我没有一个好的答案)。我能做的最好的事情是为所涉及的各种实体覆盖/添加一些方法到* Query类。