CakePhp 3 - 保存关联模型失败并以mysql错误

时间:2017-05-22 20:45:29

标签: php mysql cakephp cakephp-3.0

我有一个关于使用CakePhp 3保存相关数据的问题。不幸的是,我无法弄清楚问题是什么。我的场景非常简单。我想保存以下请求数据:

$data = [
    'name' => 'article 1',
    'comments' => [
        (int) 0 => [
            'description' => 'comment 1'
        ]
    ]
]

在这种情况下。我想用新的注释实体保存一个新的文章实体。所以对于这两个实体来说,它是表中的新记录。所以有条款表和评论表,其中每个评论都与文章表有关联。

ArticlesTable.php

    $this->hasMany('Comments', [
        'foreignKey' => 'article_id'
    ]);

CommentsTable.php

$this->belongsTo('Articles', [
    'foreignKey' => 'article_id',
    'joinType' => 'INNER'
]);

修补文章

$article = $this->Articles->patchEntity($article, $data, [
    'associated' => [
        'Comments'
    ]
]);

调试打印 - 修补文章

object(App\Model\Entity\Article) {

    'name' => 'article 1',
    'comments' => [
        (int) 0 => object(App\Model\Entity\Comment) {

            'description' => 'comment 1',
            '[new]' => true,
            '[accessible]' => [
                '*' => true
            ],
            '[dirty]' => [
                'description' => true
            ],
            '[original]' => [],
            '[virtual]' => [],
            '[errors]' => [],
            '[invalid]' => [],
            '[repository]' => 'Comments'

        }
    ],
    '[new]' => true,
    '[accessible]' => [
        '*' => true
    ],
    '[dirty]' => [
        'name' => true,
        'duration' => true,
        'comments' => true
    ],
    '[original]' => [],
    '[virtual]' => [],
    '[errors]' => [],
    '[invalid]' => [],
    '[repository]' => 'Articles'

}

SQL错误:

  

错误:SQLSTATE [42000]:语法错误或访问冲突:1064您   您的SQL语法有错误;检查对应的手册   您的MySQL服务器版本,以便使用接近'描述的正确语法,   创建,修改)VALUES(3,'评论1',' 2017-05-22 20:36:59',' 2017-05-22   20:3'在第1行

SQL查询:

BEGIN
INSERT INTO articles (name, created, modified) 
VALUES 
  (
    'article 1', '2017-05-22 20:36:59', 
    '2017-05-22 20:36:59'
  )
INSERT INTO comments (
  article_id, description, created, modified
) 
VALUES 
  (
    3, 'comment 1', '2017-05-22 20:36:59', '2017-05-22 20:36:59'
  )
ROLLBACK

这里非常详细地介绍了我正在做的事情。我只是困惑,因为我记得这是我在Cakephp 3中一直这样做的方式。抱歉问这么简单的问题。我无法弄明白。我在这里想念一下吗?有人能看出我的错吗?

1 个答案:

答案 0 :(得分:1)

你不需要为cakephp3中的简单实体插入编写SQL查询,请查看https://book.cakephp.org/3.0/en/orm/saving-data.html

在您的文章添加操作中,您应该使用$ this-> Articles-> save();

if $this->request->is('post') {

    $article = $this->Articles->newEntity($this->request->data());

    $this->Articles->save($article);

}