В одном проекте у меня есть общая таблица 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?