CakePHP一次编辑多个记录

时间:2009-09-03 23:51:40

标签: php cakephp cakephp-appmodel

我在两个表之间建立了HABTM关系:itemslocations,使用表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 .. */)
    )
)

1 个答案:

答案 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);

这会给你正确的结构,但它确实不是很好。如果有人有更多的蛋糕方式来做,我全都耳朵。 :)