cakephp:如何通过 saveAssociated 保存 hasmany 链

cakephp: How to save hasmany chain by saveAssociated

基本上有3个型号:

Class Model1 {
   Public $hasMany = array {
       'Model2' => array(
            'className' => 'Model2',
            'foreignKey' => 'model1id'
        )
   };
}

Class Model2 {
   Public $belongsTo = array {
       'Model1' => array(
            'className' => 'Model1',
            'foreignKey' => 'model1id'
        )
   };

   Public $hasMany = array {
       'Model3' => array(
            'className' => 'Model3',
            'foreignKey' => 'model2id'
        )
   };
}

Class Model3 {
   Public $belongsTo = array {
       'Model2' => array(
            'className' => 'Model2',
            'foreignKey' => 'model2id'
        )
   };
}

在Model1s视图文件夹下的ctp文件中,我有如下代码:

echo $this->Form->create('Model1');
echo $this->Form->input('[some_model1_field]');
echo $this->Form->input('Model2.0.[some_field]');
echo $this->Form->input('Model3.0.[some_field]');
echo $this->Form->end('Save');

在Controller中,有如下功能:

$this->Model1->saveAssociated($this->request->data, array('deep' => true));

结果是所有字段都插入到数据库中,包括由框架自动保存到模型2中的外键model1id table。唯一的问题是 model2id 无法由框架自动保存到 model3 table 中。如何处理?

Model1Model3 没有关联,但是您输入的字段名称和生成的请求数据代表了这种关联。调试请求数据并将其与文档显示的内容进行比较

http://book.cakephp.org/2.0/en/models/saving-your-data.html#model-saveassociated-array-data-null-array-options-array

结构的问题应该很明显,会是这样的

[
    // ...
    'Model2' => [
        [/* ... */]
    ]
    'Model3' => [
        [/* ... */]
    ]
]

如果您想为 Model2 保存 Model3s,那么您必须像

这样正确地嵌套数据
echo $this->Form->input('Model2.0.Model3.0.[some_field]');

结果应该是

[
    // ...
    'Model2' => [
        // ...
        'Model3' =>  [
            [/* ... */]
        ]
    ]
]