【问题标题】:Deep save associated models with relation back to first model深度保存关联模型与第一个模型的关系
【发布时间】:2015-11-26 10:45:54
【问题描述】:

我有 3 个模型:A、B、C。

A 有很多 B

A 有很多 C

B 有很多 C

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

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

表格数据:

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

我使用$this-&gt;A-&gt;saveAssociated($data, ['deep' =&gt; 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' =&gt; true]) 调用来保存它们?

【问题讨论】:

  • 您需要展示您正在保存的$data 的示例。
  • 如果我可以保存和查询数据。真的需要吗?但是给你。 :)
  • 我想我需要一种在保存期间覆盖 Cake 外键设置器方法的方法。
  • 谢谢。显示正在保存的数据有助于澄清您的要求。我添加了一个答案/建议(不确定是否有帮助)。

标签: cakephp cakephp-2.x


【解决方案1】:

我认为这是一个有点古怪的情况,如果没有一些帮助,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']);
}

【讨论】:

  • 是的,我做过类似的,它有效。我想找到一种更 MVC 和 DRY 的方式来做到这一点。
  • 我认为问题在于你的数据结构如何。当可以通过B 访问时,为什么CA 相关联?
  • 因为有时它不能。我的产品 (A) 具有 (B) 的组件,其中 (C) 的组件可选。有些产品只有Many (B)。
  • 如果您想要一个干的方法,您可以随时使用我的示例代码并将其重构为可重用行为的保存方法。
猜你喜欢
  • 1970-01-01
  • 2019-09-15
  • 1970-01-01
  • 2011-08-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多