CakePHP:hasOne 相关表在更新时保存多个条目

Posted

技术标签:

【中文标题】CakePHP:hasOne 相关表在更新时保存多个条目【英文标题】:CakePHP: hasOne related table saving multiple entries upon updates 【发布时间】:2010-11-18 11:00:23 【问题描述】:

对 Cake 完全陌生。

我有一个名为 Content 的表和另一个名为 ContentMeta 的表(通过 content_id 相关)。 Content 中的每个条目都有一个对应的 ContentMeta。

当我添加新内容时,这是我用来向 ContentMeta 添加新条目的代码:

if( !empty( $this->data ) ) 

 // Save Content
 $this->Content->create();
 $content = $this->Content->save( $this->data );
 // Save Meta
 if( !empty( $content ) ) 
  $this->data['ContentMeta']['content_id'] = $this->Content->id;
  $this->Content->ContentMeta->save( $this->data );
  $this->Session->setFlash( 'Content has been saved.' );
  $this->redirect( array( 'action' => 'edit', $this->Content->id ) );
 

这工作正常,向 Content 添加一个新条目,向 ContentMeta 添加一个新条目。

在更新数据(编辑模式)时,我遇到了一个小问题。 Content 的条目正在顺利更新,但在 ContentMeta 表中,每次更新都会创建一个新条目。

更新代码如下:

$this->Content->id = $id;
// Update Content
$content = $this->Content->save( $this->data );
// Update Meta
if( !empty( $content ) ) 
    //Debugger::dump(print_r($this->data,true));
    $this->data['ContentMeta']['content_id'] = $this->Content->id;
    $this->Content->ContentMeta->save( $this->data );
    $this->Session->setFlash( 'Content has been updated.' );
    $this->redirect( array( 'action' => 'edit', $this->Content->id ) );

我确定是这个块中的一些逻辑错误导致了这种情况的发生。谁能告诉我哪里出错了?

谢谢, m^e

【问题讨论】:

【参考方案1】:

对我来说,您的数据数组中缺少 $this->data['ContentMeta']['id'] 。由于该字段为空,因此蛋糕尝试创建新行。

所以在你的表单中为 ContentMeta 添加一个隐藏的 id 字段。

我认为可以改进您的代码的另一件事是使用

$this->Content->saveAll($this->data);

这样您将一次保存数据,而不是为每个模型调用 2 次 save()。查看the cookboook 中的手册(并在文本中搜索 saveAll)。

【讨论】:

完美。这完成了工作,并且 saveAll 帮助大大减少了代码。我之前确实遇到了 saveAll ,但在我手动尝试了各个步骤之前一直避免使用它。谢谢尼克:) 所有 saveAll 所做的只是调用 save() 几次(好吧 __save()),但它确实清理了代码

以上是关于CakePHP:hasOne 相关表在更新时保存多个条目的主要内容,如果未能解决你的问题,请参考以下文章

Cakephp 3.7 hasOne字段数据不保存

CakePHP 3.3.0 未更新 hasOne 表

不保存数据到2表在cakephp中有外键

cakephp 没有将更新值保存到相关表,但没有错误

CakePHP 模型链接,belongsTo,hasOne

CakePHP模型hasOne关联