【问题标题】:Many-to-many Propel relationships with attribute多对多 Propel 与属性的关系
【发布时间】:2012-11-03 14:54:23
【问题描述】:

我正在尝试设置由以下内容组成的架构(仅显示相关部分):

<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 不接受交叉引用表的任何其他字段来处理多对多关系。是否有解决此问题的方法,还是我必须为作曲家、作词家和歌手设置三个不同的表格(以及所有其他必要的调整)?

【问题讨论】:

    标签: many-to-many propel


    【解决方案1】:

    使用您提供的最后一个架构,您应该能够使用像这样的小“技巧”​​按类别过滤结果:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-01-16
      • 2012-10-27
      • 2022-10-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-01
      相关资源
      最近更新 更多