Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 如何在CakePHP 3中实现重复密钥更新时插入(又称upsert)?_Mysql_Cakephp_Insert Update_Upsert_Cakephp 3.0 - Fatal编程技术网

Mysql 如何在CakePHP 3中实现重复密钥更新时插入(又称upsert)?

Mysql 如何在CakePHP 3中实现重复密钥更新时插入(又称upsert)?,mysql,cakephp,insert-update,upsert,cakephp-3.0,Mysql,Cakephp,Insert Update,Upsert,Cakephp 3.0,我正在使用CakePHP3和MySQL 我想通过cakephp3模型实现一个INSERT on DUPLICATE KEY UPDATEakaupsert查询 给出下表: +----+----------+-----+ | id | username | age | +----+----------+-----+ | 1 | admin | 33 | | 2 | Timmy | 17 | | 3 | Sally | 23 | +----+----------+---

我正在使用CakePHP3和MySQL

我想通过
cakephp3
模型实现一个
INSERT on DUPLICATE KEY UPDATE
aka
upsert
查询

给出下表:

+----+----------+-----+
| id | username | age |
+----+----------+-----+
|  1 | admin    |  33 |
|  2 | Timmy    |  17 |
|  3 | Sally    |  23 |
+----+----------+-----+
INSERT INTO `users` (`username`, `age`) 
VALUES ('Felicia', 27), ('Timmy', 71) 
ON DUPLICATE KEY UPDATE 
`username`=VALUES(`username`),`age`=VALUES(`age`);
其中,
id
是主键,
username
是唯一索引

当我有以下值等待提升时:

Felicia, 27
Timmy, 71
我预计在升级后会出现以下结果:

+----+----------+-----+
| id | username | age |
+----+----------+-----+
|  1 | admin    |  33 |
|  2 | Timmy    |  71 |
|  3 | Sally    |  23 |
|  4 | Felicia  |  27 |
+----+----------+-----+
我知道如何在MySQL查询中进行upsert:

+----+----------+-----+
| id | username | age |
+----+----------+-----+
|  1 | admin    |  33 |
|  2 | Timmy    |  17 |
|  3 | Sally    |  23 |
+----+----------+-----+
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

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


查看有关如何在单个查询中写入插入多条记录的详细信息

StackOverflow不是代码编写服务。请发布您尝试约会的内容以及您遇到的问题。可能的重复只是为了澄清:它不是[CakePHP 3.0:如何在重复密钥更新时插入?][1][1]:@Dirk您没有澄清任何事情,您只是在发表声明。想解释一下为什么你认为它不是复制品吗?@TomaszKowalczyk现在好点了吗?