多对多 Propel 与属性的关系

标签 many-to-many 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>

上面的功能正常,但我还想向交叉引用表添加一个属性,以便我可以按类别过滤结果。

每首歌可以有很多艺术家( Composer 、作词家和歌手)。此外,一个艺术家可以拥有很多歌曲,但可以创作很多歌曲(作为 Composer ),可以为很多歌曲写歌词(作为作词家),并且可以演唱很多歌曲(作为歌手)。

通过查询:

$song->getArtists() 

我检索了这首歌的所有艺术家,但没有任何关于 Composer /作词家/歌手的信息。

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

最佳答案

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

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

关于多对多 Propel 与属性的关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13210255/

相关文章:

python - 当 Django `User` 的主键是 `CharField` 时登录时出错

java - 删除hibernate实体而不(尝试)删除关联表( View )条目

mysql - 插入时的 Symfony fk 问题

Django - 通过模板中的ManyToMany额外字段访问

java - 多对多关系 : org. hibernate.MappingException : Could not determine type for: java. util.Set

c# - Entity Framework 4.1 POCO - 多对多加载

php - 使用 composer 安装 propel

mysql - symfony 1.4 推进 :build-all not working on Mysql 5. 5

mysql - 解决此推进 "Cannot redeclare function"错误的最正确方法是什么?