0

我在两个表之间有一个 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 .. */)
    )
)
4

1 回答 1

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
)

如果要编辑 Item 模型的数据并同时将其与相应的 ItemsLocation 记录一起保存,请深入了解保存相关模型数据 (HABTM)章节。请注意这一点:

默认情况下,当保存 HasAndBelongsToMany 关系时,Cake 会在保存新行之前删除连接表上的所有行。例如,如果您有一个关联了 10 个孩子的俱乐部。然后,您使用 2 个孩子更新 Club。俱乐部只有 2 个孩子,而不是 12 个。

和:

3.7.6.5 hasAndBelongsToMany (HABTM)

unique:如果为true(默认值),更新记录时,蛋糕将首先删除外键表中现有的关系记录,然后再插入新的关系记录。所以更新时需要再次传递已有的关联。


回复:评论/编辑

我不知道 FormHelper 是否足够智能,可以自动填充结构化数组中Model.0.field的字段。如果没有,您可以自己轻松地操纵结果:[0][Model][field]

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

这会给你正确的结构,但不可否认它不是很好。如果有人有更Cakey的方式来做到这一点,我会全力以赴。:)

于 2009-09-04T02:33:21.410 回答