2010-06-11 40 views
0

我有關於連接字段上的對象關係更新的問題。更新ORM命令中的連接字段

我正在使用codeigniter和datamapper dmz的項目。但我認爲我的問題是對ORM的一般理解。所以可以自由地回答你所知道的任何ORM。

我有兩個表,貨物和標籤。一件好事可以有很多標籤。一切正常,但我正在尋找合併標籤的方式。這意味着我決定刪除標籤A,而是將其標記的所有內容都標記爲標籤B.

我只有商品和標籤的型號。關於連接關係沒有單獨的模型,因爲我相信這些ORM是設計用來工作的。

我知道如何刪除標籤。但我不知道如何進入連接表來重定向引用,因爲沒有連接表的模型。我寧願使用ORM,然後發出一個原始的SQL命令。

回答

0

這聽起來像是你需要在應用程序的語言做一些事情。即對於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
  1. 加載所有tag A
  2. 對象爲tag B刪除tag A
  3. 檢查對象;如果缺少,添加它
  4. 保存所有