CakePHP一次编辑多个记录

nic*_*ckf 0 php cakephp cakephp-model

我在两个表之间有一个HABTM关系:itemslocations使用表items_locations来加入它们.

items_locations还存储了更多信息.这是架构

items_locations(id, location_id, item_id, quantity)
Run Code Online (Sandbox Code Playgroud)

我正在尝试构建一个页面,显示一个位置中的所有项目,并让用户通过数据网格样式界面一次编辑多个字段:

Location: Factory XYZ
 ___________________________
|___Item____|___Quantity___|
| Widget    |          3   |
| Sprocket  |          1   |
| Doohickey |         15   |
----------------------------
Run Code Online (Sandbox Code Playgroud)

为了帮助解决这个问题,我有一个名为的控制器InventoryController:

var $uses = array('Item', 'Location');  // should I add 'ItemsLocation' ?
Run Code Online (Sandbox Code Playgroud)

如何构建多维表单来编辑此数据?


编辑:

我试图让我的数据看起来像Deceze如下所述,但我又遇到了问题......

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

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

当我这样做时,$this->data出现如下:

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

dec*_*eze 6

如果您不打算在Item模型中编辑数据,那么仅使用连接模型最有意义.因此,编辑每个项目数量的表单如下所示:

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

// foreach Item at Location:

echo $form->input('ItemsLocation.0.id'); // automatically hidden
echo $form->input('ItemsLocation.0.quantity');
Run Code Online (Sandbox Code Playgroud)

增加每条记录的计数器(.0.,, .1....).您应该在控制器中接收的内容$this->data应如下所示:

array(
    'ItemsLocation' => array(
        0 => array(
            'id' => 1,
            'quantity' => 42
        ),
        1 => array(
            ...
Run Code Online (Sandbox Code Playgroud)

然后,您可以像任何其他模型记录一样保存它:$this->Item->ItemsLocation->saveAll($this->data).将项目添加到位置没有太大区别,您只需离开id并让用户选择item_id.

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

如果要编辑项目模型的数据并同时使用相应的ItemsLocation记录进行保存,请进入保存相关模型数据(HABTM)一章.小心这个:

默认情况下,在保存HasAndBelongsToMany关系时,Cake将删除连接表上的所有行,然后再保存新的行.例如,如果您有一个有10个孩子关联的俱乐部.然后,您将与2名儿童一起更新俱乐部.俱乐部只有2个孩子,而不是12个孩子.

和:

3.7.6.5 hasAndBelongsToMany(HABTM)

unique:如果为true(默认值),则在更新记录时,cake会先插入外键表中的现有关系记录,然后再插入新记录.因此,在更新时需要再次传递现有关联.


回复:评论/编辑

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

foreach ($this->data as &$data) {
    $data = $data['ItemsLocation'];
}
$this->data = array('ItemsLocation' => $this->data);
Run Code Online (Sandbox Code Playgroud)

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