在CakePHP 3中更新/插入关联表数据

时间:2018-09-01 05:00:18

标签: php mysql orm associations cakephp-3.0

我是CakePHP 3的新手。我想更新/插入关系表数据。 我将Articles作为主表,Comments是一个相关表,其中article_id被存储为外键。

此外,由于我不想为Article重复注释,因此我在comment_id_body表中设置了唯一键Comments

这是我定义关系的方式。

class ArticlesTable extends Table
{
    public function initialize(array $config)
    {
        $this->hasMany('Comments');
    }
}

class CommentsTable extends Table
{
    public function initialize(array $config)
    {
        $this->belongsTo('Articles');
    }
}

这是我的代码。

$articlesTable = TableRegistry::get('Articles');
$article = $articlesTable->get(12);

$article->title = 'CakePHP is THE best PHP framework!';

$firstComment = $articlesTable->Comments->newEntity();
$firstComment->body = 'The CakePHP features are outstanding';

$article->comments = [$firstComment];

$articlesTable->save($article);

此代码的问题在于,它总是尝试在Comments表中插入新行,而不是更新现有行。因此,当我执行代码时,会出现如下错误。

  

违反完整性约束:1062重复输入

我认为上面的错误是由于表中的记录重复引起的,因为Comments表中存在具有相同数据的记录时,上面的代码一直试图插入新记录。

我要更新Comments表记录,如果在Comments表中找不到记录,那么它将在调用$articlesTable->save($article);方法保存数据时自动插入新记录。

1 个答案:

答案 0 :(得分:0)

您说'Comments是一个相关表,其中ArticleID被存储为外键'

但是在您的CommentsTable类中,您有:

$this->belongsToMany('Articles');   // Means a Comment can belong to MULTIPLE Articles

首先,假设文章可以有很多评论,但单个评论仅适用于一个文章(正常模式),则应更改CommentsTable类,使上一行变为:

$this->belongsTo('Articles');  // now a Comment only belongs to ONE Article

第二,外键的格式不符合CakePhp约定,因此请将articleID字段的名称更改为article_id-或查阅文档以了解如何向{{1}添加参数}以使用非常规外键。

如果仍然出现“重复输入”错误,则数据库中的注释表可能存在问题。 (您使body字段变得唯一吗?)