首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >多对多通过属性推动关系

多对多通过属性推动关系
EN

Stack Overflow用户
提问于 2012-11-03 22:54:23
回答 1查看 1.8K关注 0票数 2

我正在尝试设置一个包含以下内容的模式(只显示相关部分):

代码语言:javascript
复制
<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>

上面的代码运行正常,但我还想向交叉引用表中添加一个属性,这样我就可以按类别过滤结果。

每首歌可以有许多艺术家(作曲家、词作者和歌手)。此外,艺术家可以有许多歌曲,但可以创作许多歌曲(作为作曲家),可以为许多歌曲编写歌词(作为词作者),可以唱许多歌曲(作为歌手)。

通过查询:

代码语言:javascript
复制
$song->getArtists() 

我检索了这首歌的所有艺术家,但没有任何关于谁是composers/lyricists/singers的信息。

我尝试在song_artist的模式中添加一个额外的字段,以便可以通过以下方式过滤结果:

代码语言:javascript
复制
$song->getArtists()->filterByCategory('composer')

表模式如下:

代码语言:javascript
复制
<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不接受交叉引用表在多对多关系上工作的任何其他字段。有没有解决这个问题的办法,或者我必须为作曲家、词作者和歌手设置三个不同的桌子(以及所有其他必要的调整)?

EN

回答 1

Stack Overflow用户

发布于 2012-11-11 18:43:01

使用您给出的最后一个模式,您应该能够使用如下所示的小“技巧”按类别过滤结果:

代码语言:javascript
复制
$criteria = ArtistQuery::create()
  ->useSongArtistQuery()
    ->filterByCategory('composer')
  ->endUse();
$song->getArtists($criteria)
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13210255

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档