cakephp使用foreach()保存数据数组

cakephp使用foreach()保存数据数组,php,cakephp,Php,Cakephp,我试图保存来自多个同名输入的大小数据 问题是我无法保存数据。只有最后一个值“size”保存在数据库中 if ($this->EquipmentType->save($this->request->data['EquipmentType'], false)) { $id = $this->EquipmentType->getLastInsertId(); $this->loadModel('EquipmentTypesSize');

我试图保存来自多个同名输入的大小数据

问题是我无法保存数据。只有最后一个值“size”保存在数据库中

if ($this->EquipmentType->save($this->request->data['EquipmentType'], false)) {
    $id = $this->EquipmentType->getLastInsertId();
    $this->loadModel('EquipmentTypesSize');
    $sizesArray = $this->request->data['EquipmentType']['size'];
    foreach($sizesArray as $val){
        $data[] = array('EquipmentTypesSize' => array('sizes' =>  $val));
    }
    $this->request->data['EquipmentTypesSize']['equipment_type_id'] = $id;
    $this->EquipmentTypesSize->set($this->request->data);
    $this->EquipmentTypesSize->save($this->request->data['EquipmentTypesSize']);
    $this->Session->setFlash('Equipment type has been added successfully ', 'default', 'success');
    $this->redirect(array('controller' => 'equipments', 'action' => 'listequipmenttypes', 'admin' => true));
}
我想把这个保存为

equipment_type_id | size1
equipment_type_id | size2
equipment_type_id | size3

有几个问题——Kai提到的调用
create
就是其中之一

首先,这里是您的代码,但我在看到明显问题的地方添加了注释(我并没有抓住所有问题)

最后,有两件事:

  • 实际上,您应该尽可能多地将这些逻辑应用到您的
    设备类型
    模型中。因此,您可以在
    EquipmentType
    模型中创建一个
    saveWithSizes
    方法来保存大部分代码

  • 您应该研究Cake的
    saveAll
    方法()。理想情况下,您应该设置表单数据,这样您就可以调用saveAll并让Cake自动处理所有数据。然而,对于你的情况来说,这也许是可能的,也可能是不可能的


  • 有几个问题——Kai提到的调用
    create
    就是其中之一

    首先,这里是您的代码,但我在看到明显问题的地方添加了注释(我并没有抓住所有问题)

    最后,有两件事:

  • 实际上,您应该尽可能多地将这些逻辑应用到您的
    设备类型
    模型中。因此,您可以在
    EquipmentType
    模型中创建一个
    saveWithSizes
    方法来保存大部分代码

  • 您应该研究Cake的
    saveAll
    方法()。理想情况下,您应该设置表单数据,这样您就可以调用saveAll并让Cake自动处理所有数据。然而,对于你的情况来说,这也许是可能的,也可能是不可能的

  • :“如果要插入新行而不是更新现有行,则应始终首先调用create()。这样可以避免与回调或其他位置中先前可能的保存调用发生冲突。”:“如果要插入新行而不是更新现有行,则应始终调用create()首先,这避免了与以前在回调或其他地方可能进行的保存调用发生冲突。”
    <?php 
    if ($this->EquipmentType->save($this->request->data['EquipmentType'], false)) {
        $id = $this->EquipmentType->getLastInsertId();
        $this->loadModel('EquipmentTypesSize');
        $sizesArray = $this->request->data['EquipmentType']['size'];
        foreach($sizesArray as $val){
            $data[] = array('EquipmentTypesSize' => array('sizes' =>  $val));
            // WHERE IS THIS $data VARIABLE USED? It seems it's never used?
        }
        $this->request->data['EquipmentTypesSize']['equipment_type_id'] = $id;
        $this->EquipmentTypesSize->set($this->request->data); // NO NEED TO CALL SET HERE - YOU ALREADY PASS DATA IN AS A PARAM TO SAVE
        // YOU MUST CALL CREATE BEFORE ADDING A NEW RECORD
        $this->EquipmentTypesSize->save($this->request->data['EquipmentTypesSize']);
        // I DON'T THINK $this->request->data['EquipmentTypesSize'] HOLDS THE VALUE YOU THINK IT DOES AT THIS POINT
        $this->Session->setFlash('Equipment type has been added successfully ', 'default', 'success');
        $this->redirect(array('controller' => 'equipments', 'action' => 'listequipmenttypes', 'admin' => true));
    }
    
    if ($this->EquipmentType->save($this->request->data['EquipmentType'], false)) {
        $id = $this->EquipmentType->getLastInsertId();
        $this->loadModel('EquipmentTypesSize');
        $sizesArray = $this->request->data['EquipmentType']['size'];
        foreach($sizesArray as $val){
            $this->EquipmentTypesSize->create();
            $this->EquipmentTypesSize->save(array(
                'sizes' =>  $val,
                'equipment_type_id' => $id,
            ));
        }
        $this->Session->setFlash('Equipment type has been added successfully ', 'default', 'success');
        $this->redirect(array('controller' => 'equipments', 'action' => 'listequipmenttypes', 'admin' => true));
    }