nic*_*ckf 0 php cakephp cakephp-model
我在两个表之间有一个HABTM关系:items并locations使用表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)
如果您不打算在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)
这会给你正确的结构,但它确实不是很好.如果有人有更多的蛋糕方式来做,我全都耳朵.:)