Есть ли способ использовать одну таблицу наследования в качестве таблицы внешнего ключа в Propel? - PullRequest
1 голос
/ 28 февраля 2012

В одном проекте у меня есть общая таблица Meta, которую любая другая таблица может использовать для хранения дополнительных данных.

В мета-таблице есть пара столбцов (target_type, target_id), которые ссылаются на внешнюю таблицу и внешний ключ, о которых говорится в мета-записи.

, например

  • Запись мета для таблицы пользователей будет иметь (target_type, target_id) = ('users', 53)
  • Мета-запись для таблицы ослов будет иметь (target_type, target_id) = ('donkeys', 25)

Схема для мета выглядит так:

<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-> getMeta () может на самом деле возвращать метаинформацию, которая не имеет никакого отношения к ослам!

Я не вижу способа установить дополнительное условие в объявлении внешнего ключа в схеме. Это правильно?

Я подумал, что наследование может это исправить, поэтому я изменил мета-схему так:

<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>

Есть ли способ установить такую ​​связь со схемой propel?

1 Ответ

1 голос
/ 08 января 2013

К сожалению, нет. Я реализовал ту же настройку, что и вы, и попросил создателя Propel то же самое (и у него не было хорошего ответа для меня). Лучшее, что я мог сделать, это переопределить / добавить некоторые методы в классы * Query для различных задействованных сущностей.

...