我正在尝试设置包含以下内容的模式(仅显示相关部分):
<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会崩溃,当我尝试将其添加为第三个主键时(作为带有外键的category_id朝向“类别”表),它也会崩溃。
据我所知,Propel不接受交叉引用表的任何其他字段来处理多对多关系。是否有针对此问题的解决方法,或者我是否必须为作曲家,词作者和歌手设置三个不同的表(以及所有其他必要的调整)?
答案 0 :(得分:2)
使用您提供的最后一个模式,您应该能够使用类似这样的“技巧”按类别过滤结果:
$criteria = ArtistQuery::create()
->useSongArtistQuery()
->filterByCategory('composer')
->endUse();
$song->getArtists($criteria)