2013-07-17 53 views
0

我試圖批量更新發票上的相關項目表。FuelPHP ORM批量更新​​相關對象

$_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

我應該如何構造這段代碼?我不想爲每個傳入的相關項目管理添加/編輯/刪除狀態。

回答

0

如果它是一個更新,請確保您獲取要更新的項目:

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

+0

如果我第一次提取,不會刪除其不是POST的部分記錄。這是問題的一部分,因爲我想批量替換完整的數據集,除了POST和現有對象中的項目,它們應該被更新。 – willoller

+0

我應該添加我目前正在執行「手動」 - 通過循環兩組匹配,執行更新,刪除不匹配的記錄,然後再插入傳入記錄的循環。它只是看起來像這個應該工作... :) – willoller

+0

你必須作出區分之間的東西存儲和張貼,沒有辦法繞過。獲取發票對象與所有相關的項目對象,循環他們和刪除/取消任何不存在的職位,然後循環你的帖子更新/創建。 – WanWizard