CakePhp $ hasAndBelongsToMany不按预期保存多个选择项

时间:2014-01-27 19:45:24

标签: cakephp associations multi-select has-and-belongs-to-many

我有以下代码设置(为简洁而剪断)

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的“多个”部分吗?

2 个答案:

答案 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)