2009-09-03 60 views
0

我在两个表之间有一个HABTM关系:itemslocations,使用表items_locations加入它们。CakePHP一次编辑多条记录

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 .. */) 
    ) 
) 

回答

6

如果你不打算在编辑数据模型,它可能最有意义的工作仅在连接模型上。因此,您的表单编辑每个项目的数量应该是这样的:

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(默认值)蛋糕将首先删除现有的外键表的关系记录中插入新的,之前更新的时候一个记录。所以更新时需要再次传递现有的关联。


回复:评论/编辑

我不知道把我的头顶部如果表单助手有足够的智能自动填充从[0][Model][field]结构阵列Model.0.field领域。 如果没有,你可以很容易地操纵自己的结果:

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

这将使你正确的结构,但无可否认的不是很好。如果任何人有一个更加凯奇的方式来做到这一点,我全都耳熟能详。 :)

+0

现在有更多的意义..虽然我仍然打砖墙。介意看看我编辑原始帖子? – nickf 2009-09-04 04:23:53

+0

那么,当你找到**数据时,格式会稍有不同。我在说的是**将表单发布到控制器的正确格式**在接收到POST数据后,在控制器中尝试一个'debug($ this-> data)'。 – deceze 2009-09-04 05:15:19

+0

但是你不需要这种格式的视图能够做一些类似于:'$ form-> input('ItemsLocation.0.id')' – nickf 2009-09-04 05:51:39