【发布时间】:2021-03-25 04:40:53
【问题描述】:
我有这个用 postgreSQL 编写的 upsert 查询
$statement = 'INSERT INTO "CharactersUnlockToBuyLevels"
("CharacterId", "LevelId", "AmountToBuy", "EagleStatueId", "Location",
"MapCoordinateTop", "MapCoordinateLeft")
VALUES
(:CharacterId, :LevelId, :AmountToBuy, :EagleStatueId, :Location,
:MapCoordinateTop, :MapCoordinateLeft)
ON CONFLICT
("CharacterId")
DO UPDATE
SET
"LevelId" = EXCLUDED."LevelId",
"AmountToBuy" = EXCLUDED."AmountToBuy",
"EagleStatueId" = EXCLUDED."EagleStatueId",
"Location" = EXCLUDED."Location",
"MapCoordinateTop" = EXCLUDED."MapCoordinateTop",
"MapCoordinateLeft" = EXCLUDED."MapCoordinateLeft"
RETURNING "CharacterUnlockToBuyLevelId"
';
查询工作正常,如果我在 PgAdmin 中运行它,我会按预期返回“CharacterUnlockToBuyLevelId”。但是,如果我准备它并使用 PHP 的 PDO 执行它,那么我似乎无法取回 RETURNING 值。
$stmt = $this->db->prepare($statement);
$returnedId = $stmt->execute(array(
'CharacterId' => $characterId,
'LevelId' => $unlockMethod['LevelId'],
'AmountToBuy' => $unlockMethod['AmountToBuy'],
'EagleStatueId' => $unlockMethod['EagleStatueId'],
'Location' => $unlockMethod['Location'],
'MapCoordinateTop' => $unlockMethod['MapCoordinateTop'],
'MapCoordinateLeft' => $unlockMethod['MapCoordinateLeft'],
));
这只是返回true,所以$returnedId实际上不会保存id,而只是值true。如何使用 PDO 的预处理语句从 upsert 查询中获取返回值?
【问题讨论】:
-
你试过
with i as (. . . ) select i.* from i吗? -
这可以工作,但我想保持我的查询尽可能干净,而不是围绕它构建额外的,只是为了得到一个已经返回的值,并且正在寻找 PHP 中的解决方案PDO
-
。 .我注意到查询返回一列,但您似乎正在阅读其中的许多。
-
我不明白您的最后一条评论,它要么更新现有记录,要么插入新记录。我只需要知道更新/插入记录的主键“CharacterUnlockToBuyLevelId”,这就是我要返回的内容
-
。 .结果集中只返回
RETURNING子句中的列。
标签: php postgresql pdo