我是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);
方法保存数据时自动插入新记录。
答案 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字段变得唯一吗?)