2
我試圖建立由以下的架構的Propel關係(只有相關的部分顯示):許多一對多與屬性
<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>
行走打破了,當我使用這一點,當我嘗試添加它作爲第三個主鍵(作爲一個category_id與「類別」表的外鍵)時,它也打破了。
從我看來,Propel不接受任何其他領域的交叉引用表工作在多對多的關係。有沒有解決這個問題的方法,或者我必須爲作曲家,作詞家和歌手設置三張不同的表格(以及所有其他必要的調整)?