Добавление свойства во множество соединений в 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()#");
В противном случае вы можете настроить все отношения, но для этого потребуется использовать промежуточный объект между вашими видео и статьями. Если это просто временная метка, то это может быть ненужным.