【问题标题】:Is there a way to use a single inheritance table as a foreign key table in propel?有没有办法在推进中使用单个继承表作为外键表?
【发布时间】: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


    【解决方案1】:

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

    【讨论】:

    • 好点,这个问题对测试和夹具也有很大的影响,如here所述
    猜你喜欢
    • 2011-01-28
    • 2013-07-24
    • 2013-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多