深度保存关联模型与第一模型的关系

时间:2015-11-26 10:45:54

标签: cakephp cakephp-2.x

我有3个型号:A,B,C。

a hasMany B

a hasMany C

B hasMany C

    A
   / \
  /   \
 /     \
|       |
^       ^
B ----< C

我创建了视图和控制器添加方法。

表格数据:

$data = array(
    'A' => array(
        'id' => '',
        'name' => 'alpha',
        'B' => array(
            'id' => '',
            'name' => 'beta',
            'C' => array(
                'id' => '',
                'name' => 'gamma'
            )
        )
    )
)

我使用$this->A->saveAssociated($data, ['deep' => true])电话保存表单数据。

如果我查询新创建的A模型,我会得到以下数据:

array(
    'A' => array(
        'id' => (int) 111,
        'name' => 'alpha',
        'B' => array(
            'id' => (int) 9,
            'a_id' => (int) 111,
            'name' => 'beta',
            'C' => array(
                'id' => (int) 78,
                'b_id' => (int) 9,
                'a_id' => (int) 0,
                'name' => 'gamma'
            )
        )
    )
)

我的问题是C模型a_id字段与新创建的A模型没有很好的价值/不相关。

是否可以通过一次saveAssociated($data, ['deep' => true])来保存它们?

1 个答案:

答案 0 :(得分:0)

我认为这是一个奇怪的情况,而CakePHP在没有一些帮助的情况下无法处理。当CakePHP保存外键时,它与其直接关系有关。因此,在Cake保存模型C的情况下,它只知道设置C.b_id外键。您的C数据必须是A的子数组才能设置C.a_id,但它不会设置C.b_id

可能有更好的方法来解决这个问题,但一种解决方案是在保存后添加C.a_id外键: -

if ($this->A->saveAssociated($data, ['deep' => true]) !== false) {
    // Set the a_id foreign key for the newly created C record.
    $cData = [
        'id' => $this->A->B->C->id,
        'a_id' => $this->A->id
    ];
    $this->A->C->save($cData, true, ['id', 'a_id']);
}