質問

I have the following code setup (snipped for brevity)

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';    
}

Above are the simple Model classes.

/*  tables in database  */
base_packages
product_types
product_subtypes
base_packages_product_types
base_packages_product_subtypes

The first table is the main package that users are creating with the form, the product_* tables are pre-loaded with appropriate types and subtypes (they don't change very often), the last two are the Join tables that CakePhp wants to have

/*  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>
//  ...

Above we see the two controls that are loaded from the product_* tables. The types are a single select dropdown and the subtypes are a multiple select list.

/*  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));
        }
    }
}

The process is as follows, while the user creates a new BasePackage, they select a ProductType from a dropdown box and one to many ProductSubtypes from a multiple select list. When the $this->BasePackage->saveAll() call is made, the data to be inserted into base_packages and base_packages_product_types tables is inserted correctly. However, the base_packages_product_subtypes table remains untouched.

UPDATE:

If I remove the 'multiple' => 'multiple', from the form->input options, the code saves both the producttype and the productsubtype (as expected). This is obviously not sufficient, as I need to save 1-to-many. Anyone know how to activate the 'Many' part of the HABTM?

役に立ちましたか?

解決

To me BasePackage <> ProductType looks more like it should be a many-to-one relation, ie BasePackage belongsTo ProductType?

Anyways... please follow the conventions as described in the Cookbook:

http://book.cakephp.org/2.0/en/models/saving-your-data.html#saving-related-model-data-habtm

The form helper should be fed with the model name, ie ProductSubtype, and the view var should be camel backed plural, ie productSubtypes, that way CakePHP will do the rest for you automatically.

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;'
));
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top