【问题标题】:Kohana ORM - Duplicate instance / db entryKohana ORM - 重复的实例/数据库条目
【发布时间】:2012-11-25 18:54:28
【问题描述】:

我想“复制”一个 ORM 对象,然后将其保存到数据库中(使用新的主键),但我无法取消设置复制对象的主键。

    $orm1 = new Model1($id);
    if($orm1->loaded()) {
     $orm2 = $orm1;
     $orm2->id = null; //something like this?
     unset($orm2->_primary_key); //or like this?
     $orm2->save(); //I would like to create a new entry in the db but it doesn't work
    }

我希望我足够清楚......基本上,我怎样才能在数据库中“再次保存”一个模型......?

【问题讨论】:

    标签: kohana kohana-3 kohana-orm kohana-db


    【解决方案1】:

    您需要将 ORM 数据从一个模型复制到另一个模型:

    // save current data
    $data = $orm1->as_array();
    $orm2 = new Model1();
    $orm2->values($data);
    $orm2->save();
    

    此示例使用单独的 ORM 对象。您可以将值加载回$orm1,但不要忘记在$orm1->values($data) 之前调用$orm1->clear()。这会将模型重置为未加载状态。

    请注意,as_array 也将返回 belongs_to 关系。

    【讨论】:

    • 谢谢!虽然我正在使用它,但在这种情况下我没有考虑 as_array() 函数。而且我不知道清除... :)
    • 但实际上,由于 $data 将具有主键值,我不应该在重新触发 values() 之前从数组中取消它吗??
    • Kohana 会自动删除它:kohanaframework.org/3.2/guide/api/ORM#values
    • @biakaveron:从我的角度+1,您的回答帮助我在 Kohana 2 中编写自己的逻辑 [是的,我们仍在使用 K2] 作为 values() 方法而不是 K2 中的值。跨度>
    【解决方案2】:

    你可能想试试这个:

    // Reset primary key
    $this->_primary_key_value = NULL;
    

    不要忘记对象克隆:Object Cloning

    【讨论】:

    • 正如您在我的问题中的代码中看到的那样,我确实克隆了对象,并且尝试取消设置主键值,但这不起作用...
    • 你没有设置($orm2->_primary_key);但我的建议是: $this->_primary_key_value = NULL;这不一样。你所做的不是“对象克隆”。您刚刚引用了该对象。
    • _primary_key_value 是受保护的属性,因此您无法从外部更改它。
    • 是的,很抱歉。你可以试试这个: $orm2->clear(); $orm2->values($orm1->as_array()); $orm2->保存();请注意,您可能需要从 ($orm1->as_array()); 取消设置主键
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-04
    • 2017-05-08
    • 1970-01-01
    • 2012-10-16
    • 2021-12-23
    相关资源
    最近更新 更多