Обновление полей объединения в команде ORM - PullRequest
0 голосов
/ 11 июня 2010

У меня есть вопрос об объектно-реляционных обновлениях в полях соединения.

Я работаю над проектом, используя codeigniter с datamapper dmz. Но я думаю, что моя проблема с общим пониманием ORM. Поэтому не стесняйтесь отвечать на любые вопросы, которые вы знаете.

У меня есть две таблицы: Товары и Метки. Один товар может иметь много тегов. Все работает, но я ищу способ объединения тегов. Это означает, что я решил удалить тег A и вместо этого иметь все, что помечено им, теперь помечено тегом B.

У меня есть только модели для товаров и бирки. Не существует отдельной модели для отношений соединения, так как я считаю, что эти ORM были разработаны для работы.

Я знаю, как удалить метку. Но я не знаю, как добраться до таблицы соединений, чтобы перенаправить ссылки, так как не существует модели для таблицы соединений. Я предпочел бы использовать ORM, а затем вводить необработанную команду SQL.

Ответы [ 2 ]

0 голосов
/ 11 июня 2010

Это звучит как то, что вам нужно сделать на языке приложения.Т.е. для Java:

Good myGood = new Good("My Good");
Good yourGood = new Good("Your Good");

Tag mine = new Tag("mine");
Tag yours = new Tag("yours");

myGood.tag(mine);
yourGood.tag(yours);

/** Persist tags to database */
mine.save();
yours.save();

/** Persist goods to database */
myGood.save();
yourGood.save();

/** I take your good */
yourGood.tag(mine);
yourGood.removeTag(yours);

/** Update database */
yourGood.update();

/** Get my goods */
List<Good> myGoods = dao.getGoodsWithTag(mine);
log.info(yourGoods.size());  // 2
log.info(myGoods.get(0));  // "My Good"
log.info(myGoods.get(1));  // "Your Good"

/** Get your goods */
List<Good> yourGoods = dao.getGoodsWithTag(yours);
log.info(yourGoods.size());  // 0

Теперь это только удаляет тег из одного объекта и помещает в него другой.Чтобы полностью удалить тег из базы данных и заменить его другим существующим тегом, вы можете повторить эти шаги на языке приложения или на языке базы данных:

/** Make all of your goods mine */

/** Get your goods */
List<Good> yourGoods = dao.getGoodsWithTag(yours);
for (Good yoursRightNow : yourGoods) {
    yoursRightNow.tag(mine);
    yoursRightNow.removeTag(yours);
    yoursRightNow.update();  // Or do this later as a transaction
}

или:

/** Make all of your goods mine through SQL */
dao.sendSql("UPDATE goods_tags SET tagId = " + mine.getId() + " WHERE tagId = " + yours.getId() + ";");
dao.sendSql("DELETE FROM tags WHERE tag = \"yours\";");
0 голосов
/ 11 июня 2010
  1. Загрузить все объекты с помощью tag A
  2. Удалить tag A
  3. Проверить объекты на tag B; если отсутствует, добавьте его
  4. Сохранить все
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...