以下で構成されるスキーマをセットアップしようとしています (関連する部分のみが表示されます)。
<table name="song" phpName="Song">
<column name="id" type="integer" required="true" primaryKey="true" autoIncrement="true"/>
<column name="title" type="varchar" size="255" required="true"/>
</table>
<table name="artist" phpName="Artist">
<column name="id" type="integer" required="true" primaryKey="true" autoIncrement="true"/>
<column name="name" type="varchar" size="255" required="true" />
<column name="surname" type="varchar" size="255" required="true" />
<column name="information" type="varchar" size="255"/>
</table>
<table name="song_artist" isCrossRef="true">
<column name="song_id" type="integer" required="true" primaryKey="true"/>
<column name="artist_id" type="integer" required="true" primaryKey="true"/>
<foreign-key foreignTable="song">
<reference local="song_id" foreign="id"/>
</foreign-key>
<foreign-key foreignTable="artist">
<reference local="artist_id" foreign="id"/>
</foreign-key>
</table>
上記は正しく機能していますが、クロスリファレンス テーブルに属性を追加して、結果をカテゴリ別にフィルターできるようにしたいと考えています。
各曲には多くのアーティスト (作曲家、作詞家、歌手) を含めることができます。また、アーティストは多くの曲を持つことができますが、(作曲家として) 多くの曲を作曲したり、(作詞家として) 多くの曲の作詞をしたり、(歌手として) 多くの曲を歌ったりすることができます。
照会することにより:
$song->getArtists()
曲のすべてのアーティストを取得しますが、誰がcomposers/lyricists/singers
.
song_artist
次の方法で結果をフィルタリングできるように、スキーマに追加のフィールドを追加しようとしました。
$song->getArtists()->filterByCategory('composer')
テーブル スキーマは次のとおりです。
<table name="song_artist" isCrossRef="true">
<column name="song_id" type="integer" required="true" primaryKey="true"/>
<column name="artist_id" type="integer" required="true" primaryKey="true"/>
<column name="category" type="enum" valueSet="composer, lyricist, singer" required="true"/>
<foreign-key foreignTable="song">
<reference local="song_id" foreign="id"/>
</foreign-key>
<foreign-key foreignTable="artist">
<reference local="artist_id" foreign="id"/>
</foreign-key>
</table>
これを使用すると Propel が故障し、3 番目の主キーとして (「category」テーブルへの外部キーを持つ category_id として) 追加しようとすると故障します。
私の推測では、Propel は相互参照テーブルが多対多の関係で機能するための他のフィールドを受け入れません。この問題の回避策はありますか?それとも、作曲家、作詞家、歌手用に 3 つの異なるテーブルをセットアップする必要がありますか?