如何在CakePHP 3中实现对重复键更新的插入(又名upsert)?

金·斯塔克斯

我正在使用CakePHP 3和MySQL。

我想通过模型实现一个INSERT on DUPLICATE KEY UPDATEakaupsert查询CakePHP 3

给出下表:

+----+----------+-----+
| id | username | age |
+----+----------+-----+
|  1 | admin    |  33 |
|  2 | Timmy    |  17 |
|  3 | Sally    |  23 |
+----+----------+-----+

其中id,主键username是唯一索引

当我有以下值等待更新时:

Felicia, 27
Timmy, 71

我期望在upsert之后会有以下结果

+----+----------+-----+
| id | username | age |
+----+----------+-----+
|  1 | admin    |  33 |
|  2 | Timmy    |  71 |
|  3 | Sally    |  23 |
|  4 | Felicia  |  27 |
+----+----------+-----+

我知道如何在MySQL查询中进行upsert:

INSERT INTO `users` (`username`, `age`) 
VALUES ('Felicia', 27), ('Timmy', 71) 
ON DUPLICATE KEY UPDATE 
`username`=VALUES(`username`),`age`=VALUES(`age`);

我知道如何在CakePHP3中完成多个查询。

   $newUsers = [
        [
            'username' => 'Felicia',
            'age' => 27,
        ],
        [
            'username' => 'Timmy',
            'age' => 71,
        ],
    ];

    foreach ($newUsers as $newUser) {
        $existingRecord = $this->Users->find()
            ->select(['id'])
            ->where(['username' => $newUser['username']])
            ->first();

        if (empty($existingRecord)) {
            $insertQuery = $this->Users->query();
            $insertQuery->insert(array_keys($newUser))
                ->values($newUser)
                ->execute();
        } else {
            $updateQuery = $this->Users->query();
            $updateQuery->update()
                ->set($newUser)
                ->where(['id' => $existingRecord->id])
                ->execute();
        }
    }

我想知道的是:

即使我使用链接,有没有办法在同一行中使用CakePHP 3进行upsert?

请告知我该如何实施。

金·斯塔克斯

使用https://stackoverflow.com/a/24990944/80353提供的答案,我想使用问题中给出的代码示例来重述此问题。

在以下记录上运行upsert

Felicia, 27
Timmy, 71

进入这张桌子

+----+----------+-----+
| id | username | age |
+----+----------+-----+
|  1 | admin    |  33 |
|  2 | Timmy    |  17 |
|  3 | Sally    |  23 |
+----+----------+-----+

最好的方法是将其写为

$newUsers = [
    [
        'username' => 'Felicia',
        'age' => 27,
    ],
    [
        'username' => 'Timmy',
        'age' => 71,
    ],
];

$columns = array_keys($newUsers[0]);

$upsertQuery = $this->Users->query();

$upsertQuery->insert($columns);

// need to run clause('values') AFTER insert()
$upsertQuery->clause('values')->values($newUsers);

$upsertQuery->epilog('ON DUPLICATE KEY UPDATE `username`=VALUES(`username`), `age`=VALUES(`age`)')
                ->execute();

检查出关于细节epilog

检查出以了解如何编写插入在单个查询多个记录

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何在CakePHP插件中实现ACL

来自分类Dev

如何在CakePHP中实现搜索分页

来自分类Dev

如何在 CakePHP 中强制插入?

来自分类Dev

如何在cakephp中编写更新查询

来自分类Dev

Cakephp 3:如何在助手中实现事件

来自分类Dev

如何在cakephp 3中创建候选键?

来自分类Dev

如何在cakephp中编写SQL查询?

来自分类Dev

如何在cakephp中设置默认时区?

来自分类Dev

如何在Cakephp 3.0中读写会话

来自分类Dev

如何在CakePHP查询中创建`IN`子句?

来自分类Dev

如何在cakephp中运行子查询

来自分类Dev

如何在连接表中查找Cakephp?

来自分类Dev

如何在CakePHP中重写URL

来自分类Dev

如何在cakephp中设置时区?

来自分类Dev

如何在cakephp中获取URL参数?

来自分类Dev

如何在cakephp中设置cronjobs

来自分类Dev

如何在cakephp中的锚内添加跨度插入符号

来自分类Dev

PHP - 如何在 CakePhp 中获取插入记录的 id

来自分类Dev

如何在CakePHP 3中的hasMany关系中列出对象?

来自分类Dev

如何在CakePHP 3中使用postGIS

来自分类Dev

如何在CakePHP 3的find中包含虚拟字段?

来自分类Dev

如何在CakePHP 3中修改UNION查询?

来自分类Dev

如何在cakephp 3中执行存储过程?

来自分类Dev

如何在cakePHP3中删除特定用户的会话?

来自分类Dev

如何在cakephp 3中获取表的className?

来自分类Dev

如何在cakephp 3中具有全局参数?

来自分类Dev

如何在CakePHP 3.x中验证URL?

来自分类Dev

如何在cakephp中连接3个表?(关系)

来自分类Dev

如何在cakephp 3中具有全局参数?