Добавление свойства во множество соединений в Transfer ORM (Coldfusion)

Я использую перевод, и у меня есть отношения ManyToMany между статьями и видео. Что мне нужно сделать, так это прикрепить отметку времени к каждому видео, когда оно добавляется в статью. т.е. у меня есть две таблицы:

  • статья (удостоверение личности, название, тело)
  • видео (ID, URL)

Затем у меня есть связанная таблица:

  • article_videos (articleID, videoID)

Мне нужно добавить в дополнительный столбец timeStamp к article_videos:

  • article_videos (articleID, videoID, отметка времени)

Проблема в том, что когда я пытаюсь создать дополнительное свойство в таблице ссылок, оно не работает.

Моя конфигурация передачи 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 не разрешено, оно выдает ошибку, говорящую о том, что конфигурация передачи искажена.

Где и как мне добавить временную метку, помня о том, что временная метка должна быть для этого видео в этой статье, поскольку видео может использоваться в нескольких статьях?

Заранее спасибо.

1 ответ

Решение

То, что вам, вероятно, придется сделать, это создать новый объект для вашего article_videos присоединиться.

Поскольку Transfer ORM прозрачно обрабатывает объединения "многие ко многим", поэтому вы не будете напрямую взаимодействовать с таблицей соединений, если хотите добавить дополнительные свойства в объединении и получить к ним доступ, вам потребуется создать новый объект. Есть несколько способов добиться этого.

Если вы по-прежнему хотите прозрачно обрабатывать отношение "многие ко многим", а временная метка будет автоматически заполняться базой данных, вы можете сохранить отношение как есть и добавить новый объект, представляющий article_videos и новые отношения, объединяющие этот объект с объектами статьи и видео.

Таким образом, вы бы добавили новый объект, представляющий article_videosЯ также мог бы добавить суррогатный ключ в базу данных, или вы можете использовать составной идентификатор:

<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()#");

В противном случае вы можете настроить все отношения, но для этого потребуется использовать промежуточный объект между вашими видео и статьями. Если это просто временная метка, то это может быть ненужным.

Другие вопросы по тегам