【问题标题】:FuelPHP ORM bulk update related objectsFuelPHP ORM批量更新​​相关对象
【发布时间】:2013-07-17 02:50:22
【问题描述】:

我正在尝试批量更新包含发票上相关项目的表格。

$_POST           Existing relations   intended result
=====================================================
                 item_id: 3           unlink 3
item_id: 4       item_id: 4           update 4
item_id: 5       item_id: 5           update 5
item_id: null                         create x
item_id: null                         create x

我正在推送一个包含 $_propertiesModel 预期的所有对象的 json 数组。

我的控制器方法如下所示:

public function update_items($invoice_id) 
{
    $invoice = Model_Invoice::find($invoice_id);

    if ($items = MyInput::json())
    {
        $invoice->from_array(array('invoice_items' => $items));
    }

    $invoice->save();
}

这会在保存相关对象 (invoice_items) 时产生 PK 冲突错误。 这是因为$invoice->invoice_items中更新的对象都是is_new() == true

我应该如何构建这段代码?我不想为每个传入的相关项目管理添加/编辑/删除状态。

【问题讨论】:

    标签: orm fuelphp


    【解决方案1】:

    如果是更新,请确保获取要更新的项目:

    $invoice = Model_Invoice::find($invoice_id, array('related' => array('invoice_items')));

    【讨论】:

    • 如果我先获取,它不会删除不属于 POST 的记录。这是问题的一部分,因为我想批量替换完整的数据集,除了 POST 和现有对象中的项目,应该更新。
    • 我应该补充一下,我目前正在“手动”执行此操作 - 循环遍历两组匹配项、执行更新、删除不匹配的记录,然后再循环插入传入记录。看起来这应该可以工作...... :)
    • 您必须区分存储的内容和发布的内容,这是无法解决的。获取带有所有相关项目对象的发票对象,遍历它们并删除/取消设置帖子中不存在的任何内容,然后遍历您的帖子以更新/创建。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-28
    • 1970-01-01
    • 1970-01-01
    • 2018-11-18
    相关资源
    最近更新 更多