[英]CakePHP edit multiple records at once
我在兩個表之間建立了HABTM關系: items
和locations
,使用表items_locations
將它們items_locations
在一起。
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 .. */)
)
)
如果您不打算在Item
模型中編輯數據,則僅在聯接模型上工作可能最有意義。 這樣,您用於編輯每個項目數量的表格將如下所示:
echo $form->create('ItemsLocation');
// foreach Item at Location:
echo $form->input('ItemsLocation.0.id'); // automatically hidden
echo $form->input('ItemsLocation.0.quantity');
為每個記錄增加計數器( .0.
, .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
)
如果要編輯Item模型的數據並同時將其與相應的ItemsLocation記錄一起保存 ,請進入“ 保存相關模型數據(HABTM)”一章。 請注意以下幾點:
默認情況下,保存HasAndBelongsToMany關系時,Cake將在保存新行之前刪除聯接表上的所有行。 例如,如果您有一個包含10個子級的俱樂部。 然后,您更新有2個孩子的俱樂部。 俱樂部只有2個孩子,沒有12個孩子。
和:
3.7.6.5 hasAndBelongsToMany(HABTM)
unique :如果為true(默認值),則在更新記錄時,cake將首先刪除外鍵表中的現有關系記錄,然后再插入新的關系記錄。 因此,更新時需要再次傳遞現有的關聯。
回復:評論/編輯
我不知道FormHelper是否足夠智能,可以從[0][Model][field]
結構化數組中自動填充Model.0.field
字段。 如果沒有 ,您可以自己輕松地操縱結果:
foreach ($this->data as &$data) {
$data = $data['ItemsLocation'];
}
$this->data = array('ItemsLocation' => $this->data);
那將為您提供正確的結構,但是請記住這不是很好。 如果有人有一個更像蛋糕的方式來做,那我全都聽了。 :)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.