如何在CakePhp中保存HABTM关联?

时间:2013-12-13 20:20:40

标签: cakephp save has-and-belongs-to-many

我有一个产品型号和一个图像模型。他们有一个HABTM协会。 存在一些图像,但它们与产品无关。 现在,当我保存产品时,我想使用图像ID(我必须使用此数组)将其链接到一些未链接的图像。

这是我的代码:

class Image extends AppModel {
  public $useTable = 'images';
  var $hasAndBelongToMany = array(
    'Product' => array(
      'className' => 'Product',
      'joinTable' => 'products_images',
      'foreignKey' => 'id_image',
      'associationForeignKey' => 'id_product'
    )
  );
}

class Product extends AppModel {
  public $useTable = 'products';
  var $hasAndBelongToMany = array(
    'Image' => array(
      'className' => 'Image',
      'joinTable' => 'products_images',
      'foreignKey' => 'id_product',
      'associationForeignKey' => 'id_image'
    )
  );
}

class productsController extends AppController {
  public $name = 'Products';
  public $uses = array('Products', 'File');

  public function add() {
    if (!empty($this->data)) {
      $this->Product->create();
      if ($this->AnnuncioImmobiliare->save($this->request->data)) {
        $idProduct = $this->Product->getLastInsertID();
        $this->request->data['imagesIds'] = array("1", "2", "3");
        if(isset($this->request->data['imagesIds'])){
          foreach($this->request->data['imagesIds'] as $imageId){
            $this->Image->id = $imageId;
            $this->Image->save(array('Product'=>array('id'=>$idProduct)));
          }
        }
      }
    }
  }
}

这不起作用。我哪里错了?

2 个答案:

答案 0 :(得分:0)

1)您没有提供数据,因此我们无法以正确的格式验证数据。

2)你使用的是“save()”而不是“saveAll()”或“saveMany()”或“saveAssociated()”。只使用“save()”不会保存任何相关的模型数据。

答案 1 :(得分:0)

我自己找到了解决方案! 我观察了当使用为HABTM关联自动创建的输入传递数据时CakePHP如何处理$ this-> data->响应数组,我发现数组的格式应如下所示:

array(
  'Product' => array(
    'name' => 'myProduct',
    'id' => ''
  ),
  'Image' => array(
    'Image'=>array(
      0 => '1',
      1 => '2',
      2 => '3'
    )
  )
)

所以控制器的正确代码是

class productsController extends AppController {
  public $name = 'Products';
  public $uses = array('Products', 'File');

  public function add() {
    if (!empty($this->data)) {
      $this->Product->create();
      if (isset($this->request->data['imagesIds'])) {
        $this->request->data['Image'] = array('Image' => $this->request->data['imagesIds']);
      }
      if ($this->AnnuncioImmobiliare->save($this->request->data)) {
        /* success */
      }
    }
  }
}

就是这样!我希望你觉得这很有用。