我在两个表之间建立了HABTM关系:items
和locations
,使用表items_locations
加入它们。
items_locations
还会存储更多信息。这是架构
items_locations(id, location_id, item_id, quantity)
我正在尝试构建一个显示一个位置中所有项目的页面,并让用户通过数据网格样式界面一次编辑多个字段:
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 .. */)
)
)
答案 0 :(得分:6)
如果您不打算在Item
模型中编辑数据,那么仅对连接模型起作用最有意义。因此,编辑每个项目数量的表单如下所示:
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(默认值),则在更新记录时,cake会先插入外键表中的现有关系记录,然后再插入新记录。因此,在更新时需要再次传递现有的关联。
回复:评论/修改
如果FormHelper非常智能,可以从Model.0.field
结构化数组中自动填充[0][Model][field]
字段,我不知道如何。 如果不是,您可以自己轻松操控结果:
foreach ($this->data as &$data) {
$data = $data['ItemsLocation'];
}
$this->data = array('ItemsLocation' => $this->data);
这会给你正确的结构,但它确实不是很好。如果有人有更多的蛋糕方式来做,我全都耳朵。 :)