【问题标题】:Updating join fields in an ORM command更新 ORM 命令中的连接字段
【发布时间】:2011-03-02 19:38:23
【问题描述】:

我有一个关于连接字段上的对象关系更新的问题。

我正在使用带有 datamapper dmz 的 codeigniter 进行项目。但我认为我的问题在于对 ORM 的一般理解。因此,请随意回答您知道的任何 ORM。

我有两张表,商品和标签。一种商品可以有很多标签。一切正常,但我正在寻找一种合并标签的方法。这意味着我决定我要删除标签 A,而是让所有被它标记的东西,现在都被标签 B 标记。

我只有商品和标签的模型。连接关系没有单独的模型,因为我相信这些 ORM 是为工作而设计的。

我知道如何删除标签。但我不知道如何进入连接表以重定向引用,因为连接表没有模型。我宁愿使用 ORM 然后发出原始 SQL 命令。

【问题讨论】:

    标签: join orm


    【解决方案1】:

    这听起来像是您需要在应用程序语言中执行的操作。 IE。对于 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\";");
    

    【讨论】:

      【解决方案2】:
      1. tag A加载所有对象
      2. 删除tag A
      3. 检查tag B的对象;如果没有,请添加它
      4. 全部保存

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-08-24
        • 2021-01-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-09-09
        相关资源
        最近更新 更多