我有以下代码设置(为简洁而剪断)
class BasePackage extends AppModel {
public $name = 'BasePackage';
public $hasAndBelongsToMany = array('ProductSubtype', 'ProductType');
}
class ProductType extends AppModel {
public $name = 'ProductType';
}
class ProductSubtype extends AppModel {
public $name = 'ProductSubtype';
}
以上是简单的模型类。
/* tables in database */
base_packages
product_types
product_subtypes
base_packages_product_types
base_packages_product_subtypes
第一个表是用户使用表单创建的主包,product_ *表预先加载了适当的类型和子类型(它们不经常更改),后两个是CakePhp的Join表想拥有
/* in BasePackage/add.ctp */
// ...
<ul class="nwblock">
<li>
<?php
echo $this->Form->input('ProductType.product_type_id', array(
'label' => 'Choose Product Type',
'type' => 'select',
'class' => 'form-control',
'style' => 'width:300px; margin-bottom:20px;',
'options' => $protypes
));
?>
</li>
</ul>
<ul class="nwblock">
<li>
<?php
echo $this->Form->input('ProductSubtype.product_subtype_id', array(
'label' => 'Choose Subtype(s)',
'multiple' => 'multiple',
'type' => 'select',
'class' => 'form-control',
'style' => 'width:300px;height:390px;margin-bottom:20px;',
'options' => $subtypes
));
?>
</li>
</ul>
// ...
上面我们看到从product_ *表中加载的两个控件。类型是单个选择下拉列表,子类型是多选列表。
/* in BasePackageController.php */
public function add() {
$protypes = $this->BasePackage->ProductType->find('list',
array('fields' => array('ProductType.id', 'ProductType.display')));
$subtypes = $this->BasePackage->ProductSubtype->find('list',
array('fields' => array('ProductSubtype.id', 'ProductSubtype.display')));
$this->set('protypes', $protypes);
$this->set('subtypes', $subtypes);
if ($this->request->is('post')) {
$this->BasePackage->create();
if (!empty($this->request->data)) {
$this->BasePackage->saveAll($this->request->data, array('deep' => true));
}
}
}
该过程如下,当用户创建新的BasePackage时,他们从下拉框中选择一个ProductType,从多个选择列表中选择一个到多个ProductSubtypes。当进行$ this-&gt; BasePackage-&gt; saveAll()调用时,将正确插入要插入base_packages和base_packages_product_types表的数据。但是,base_packages_product_subtypes表保持不变。
更新
如果我从表单&gt;输入选项中删除'multiple' => 'multiple',
,则代码会同时保存producttype和productsubtype(如预期的那样)。这显然是不够的,因为我需要保存1对多。有人知道如何激活HABTM的“多个”部分吗?
答案 0 :(得分:1)
对我来说BasePackage <> ProductType
看起来更像是多对一的关系,即BasePackage belongsTo ProductType
?
无论如何......请遵循Cookbook中描述的惯例:
<强> http://book.cakephp.org/2.0/en/models/saving-your-data.html#saving-related-model-data-habtm 强>
表单助手应该使用模型名称,即ProductSubtype
,并且视图var应该是驼背复数,即productSubtypes
,这样CakePHP将自动为您完成其余的工作。< / p>
public function add() {
// ...
$this->set('productSubtypes', $subtypes);
// ...
}
echo $this->Form->input('ProductSubtype', array(
'label' => 'Choose Subtype(s)',
'class' => 'form-control',
'style' => 'width:300px;height:390px;margin-bottom:20px;'
));
答案 1 :(得分:0)
您可以尝试使用BasePackage->saveAssociated
吗?