2

我正在使用传输,并且文章和视频之间存在多对多关系。我需要做的是在将每个视频添加到文章时为其添加时间戳。即我有两张桌子:

  • 文章(ID、标题、正文)
  • 视频(ID,网址)

然后我有一个链接表:

  • article_videos(articleID, videoID)

我需要在 article_videos 中添加一个额外的列 timeStamp:

  • article_videos(articleID, videoID, timeStamp)

我遇到的问题是,当我尝试在链接表中创建一个额外的属性时,它不起作用。

我的转移 ORM 配置:

<package name="article">
    <object name="Article" table="article">
        <id name="ID" type="numeric"/>
        <property name="Title" type="string" column="title"/>
        <property name="Body" type="string" column="body"/>

        <manytomany name="Videos" table="article_videos">
            <link to="article.Atricle" column="articleID"/>
            <link to="assets.Video" column="videoID"/>
            <collection type="array">
                <order property="OrderIndex" order="asc"/>
            </collection>
            <property name="TimeStamp" type="timestamp" column="timeStamp"/>
        </manytomany>
    </object>
</package>

<package name="assets">
    <object name="Video" table="video">
        <id name="ID" type="numeric"/>
        <property name="url" type="string" column="url"/>
    </object>
</package>

问题是 ManyToMany 中的新属性是不允许的,它会抛出一个错误,指出 Transfer 配置格式错误。

我应该在哪里以及如何添加时间戳,因为该视频可能在多篇文章中使用,因此该文章中的视频需要时间戳?

提前致谢。

4

1 回答 1

3

您可能需要做的是为您的article_videos联接创建一个新对象。

因为 Transfer ORM 透明地处理多对多连接,所以如果您想在连接上添加和访问其他属性,您不需要直接与连接表交互,您需要创建一个新对象。有几种方法可以实现这一目标。

如果您仍然想透明地处理多对多关系并且时间戳将由数据库自动填充,您可以保持关系不变并添加一个新对象表示article_videos和一个新关系将该对象连接到文章和视频对象.

因此,您将添加一个表示 的新对象article_videos,我还可能向数据库添加一个代理键,或者您可能想要使用复合 ID:

<object name="ArticleVideo" table="article_videos">
  <id name="ID" type="numeric"/>
  <property name="TimeStamp" type="timestamp" column="timeStamp"/>
</object>

然后你会更新你的Article对象来引用这个新对象:

<object name="Article" table="article">
  <id name="ID" type="numeric"/>
  <property name="Title" type="string" column="title"/>
  <property name="Body" type="string" column="body"/>

  <manytomany name="Videos" table="article_videos">
    <link to="article.Article" column="articleID"/>
    <link to="assets.Video" column="videoID"/>
    <collection type="array">
      <order property="OrderIndex" order="asc"/>
    </collection>
  </manytomany>

  <onetomany name="ArticleVideo">
    <link to="article.ArticleVideo" column="articleID"/>
    <collection type="array">
      <order property="TimeStamp" order="asc"/>
    </collection>
  </onetomany>
</object>

您还将更新您的Video对象:

<object name="Video" table="video">
  <id name="ID" type="numeric"/>
  <property name="url" type="string" column="url"/>

  <onetomany name="ArticleVideo">
    <link to="article.ArticleVideo" column="videoID"/>
    <collection type="array">
      <order property="TimeStamp" order="asc"/>
    </collection>
  </onetomany>
</object>

这样,您可以正常使用与Article对象的Video关系,但如果需要,可以访问其他属性:

// Creating the join using the many-to-many relationship
article = transfer.get("article.Article", 1);
article.addVideo(video);

然后,您还可以访问联接,如何获取将上述关系与联接相关联的信息可能需要一些工作,因此您可能必须预先决定您正在创建的联接是否需要更多信息:

// Creating the join using the ArticleVideo object
articleVideo = transfer.new("article.ArticleVideo");
articleVideo.addParentArticle(article);
articleVideo.addParentVideo(video);
transfer.save(articleVideo);

// Using a composite ID to access the ArticleVideo
articleVideo = transfer.get("article.ArticleVideo", {
  "ArticleID" = 1,
  "VideoID" = 1
});
WriteOutput("The timestamp is: #articleVideo.getTimeStamp()#");

否则,您可以调整所有关系,但这需要您在视频和文章之间使用中间对象。如果它只是一个时间戳,那么它可能是不必要的。

于 2012-12-29T11:49:20.137 回答