2012-11-03 36 views
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不接受任何其他領域的交叉引用表工作在多對多的關係。有沒有解決這個問題的方法,或者我必須爲作曲家,作詞家和歌手設置三張不同的表格(以及所有其他必要的調整)?

回答

2

隨着你給的最後一個模式,你應該能夠使用一個小「絕招」像這樣的篩選按類別結果:

$criteria = ArtistQuery::create() 
    ->useSongArtistQuery() 
    ->filterByCategory('composer') 
    ->endUse(); 
$song->getArtists($criteria)