2

以下で構成されるスキーマをセットアップしようとしています (関連する部分のみが表示されます)。

<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 つの異なるテーブルをセットアップする必要がありますか?

4

1 に答える 1

2

最後に指定したスキーマを使用すると、次のような小さな「トリック」を使用して、結果をカテゴリ別にフィルター処理できるはずです。

$criteria = ArtistQuery::create()
  ->useSongArtistQuery()
    ->filterByCategory('composer')
  ->endUse();
$song->getArtists($criteria)
于 2012-11-11T10:43:00.510 に答える