2009-09-03 79 views
0

我在兩個表之間有一個HABTM關係:itemslocations,使用表items_locations加入它們。CakePHP一次編輯多條記錄

items_locations也存儲更多信息。這裏的架構

items_locations(id, location_id, item_id, quantity) 

我想馬上建立一個網頁,其中顯示了一個位置的所有項目,並讓用戶通過一個DataGrid風格界面,編輯多個領域:

Location: Factory XYZ 
___________________________ 
|___Item____|___Quantity___| 
| Widget |   3 | 
| Sprocket |   1 | 
| Doohickey |   15 | 
---------------------------- 

爲了解決這個問題,我有一個名爲InventoryController控制器,它具有:

var $uses = array('Item', 'Location'); // should I add 'ItemsLocation' ? 

如何構建多維形式來編輯這些數據?


編輯:

我試圖讓我的數據看起來像Deceze如何下面描述,但我又遇到了問題......

// inventory_controller.php 
function edit($locationId) { 

    $this->data = $this->Item->ItemsLocation->find(
     'all', 
     array(
      "conditions" => array("location_id" => $locationId) 
     ) 
    ); 

當我這樣做,$this->data出來是這樣的:

Array (
    [0] => Array (
     [ItemsLocation] => Array (
      [id] => 16 
      [location_id] => 1 
      [item_id] => 1 
      [quantity] => 5 
     ) 
    ) 
    [1] => Array (
     [ItemsLocation] => Array (/* .. etc .. */) 
    ) 
) 

回答

6

如果你不打算在編輯數據模型,它可能最有意義的工作僅在連接模型上。因此,您的表單編輯每個項目的數量應該是這樣的:

echo $form->create('ItemsLocation'); 

// foreach Item at Location: 

echo $form->input('ItemsLocation.0.id'); // automatically hidden 
echo $form->input('ItemsLocation.0.quantity'); 

增加每條記錄的計數器(.0..1.,...)。 $this->data應該看什麼,你應該在你的控制器可以接收這樣的:

array(
    'ItemsLocation' => array(
     0 => array(
      'id' => 1, 
      'quantity' => 42 
     ), 
     1 => array(
      ... 

然後,您可以簡單地保存這就像任何其他模型記錄:$this->Item->ItemsLocation->saveAll($this->data)。添加一個項目到一個位置並沒有太大的不同,你只需要離開id並讓用戶選擇item_id

array(
    'location_id' => 42, // prepopulated by hidden field 
    'item_id' => 1  // user selected 
    'quantity' => 242 
) 

如果你要編輯的項目模型的數據,並與相應的ItemsLocation記錄保存在同一時間,潛入Saving Related Model Data (HABTM)章。請注意:

默認情況下,當保存一個HasAndBelongsToMany關係時,Cake會在保存新連接表之前刪除連接表上的所有行。例如,如果您有一個有10個孩子關聯的俱樂部。然後您更新俱樂部與2個孩子。該俱樂部只有2個孩子,而不是12個。

和:

3.7.6.5 hasAndBelongsToMany (HABTM)

獨特:如果爲true(默認值)蛋糕將首先刪除現有的外鍵表的關係記錄中插入新的,之前更新的時候一個記錄。所以更新時需要再次傳遞現有的關聯。


回覆:評論/編輯

我不知道把我的頭頂部如果表單助手有足夠的智能自動填充從[0][Model][field]結構陣列Model.0.field領域。 如果沒有,你可以很容易地操縱自己的結果:

foreach ($this->data as &$data) { 
    $data = $data['ItemsLocation']; 
} 
$this->data = array('ItemsLocation' => $this->data); 

這將使你正確的結構,但無可否認的不是很好。如果任何人有一個更加凱奇的方式來做到這一點,我全都耳熟能詳。 :)

+0

現在有更多的意義..雖然我仍然打磚牆。介意看看我編輯原始帖子? – nickf 2009-09-04 04:23:53

+0

那麼,當你找到**數據時,格式會稍有不同。我在說的是**將表單發佈到控制器的正確格式**在接收到POST數據後,在控制器中嘗試一個'debug($ this-> data)'。 – deceze 2009-09-04 05:15:19

+0

但是你不需要這種格式的視圖能夠做一些類似於:'$ form-> input('ItemsLocation.0.id')' – nickf 2009-09-04 05:51:39