如何在 JSON (RedBeanPHP) 中使用占位符?

How to use placeholders in JSON (RedBeanPHP)?

我有一个任务:检查 $username 是否对标识符 $id 的记录投了赞成票。为此,我需要检查“投票”单元格中的 JSON 数组中的“upvote”字段是否包含用户名(即 $username)。所以我写了这段代码(PostgreSQL DB):

$foo = R::getRow('SELECT "votes"::jsonb @> \'{"upvote":[":username"]}\'::jsonb AS "is_upvoted" FROM "pages" WHERE "id" = :id', [":id"=>$id,":username"=>$username];

问题是RedBeanPHP在替换占位符时将它们用单括号括起来,但是PostgreSQL要求我用双引号将JSON数组的字段名/值括起来。

那么我怎样才能让RB不把占位符用单引号引起来呢?或者如何让占位符用双引号引起来?

无需手动编写 JSON 并通过 RB 在其中填写占位符。 有必要创建一个具有所需 JSON 结构的数组,并使用 ready-made 数组/变量来填充它。

这是我的做法:

$username_in_array = array('upvote' => array($username));
$username_in_json = json_encode($username_in_array);
$is_upvoted = R::getRow('SELECT "votes"::jsonb @> :username::jsonb AS "is_upvoted" FROM "pages" WHERE "id" = :id', [":id"=>$id,":username"=>$username_in_json];

请求采用以下形式:

SELECT "votes"::jsonb @> '{"upvote":["admin"]}'::jsonb AS "is_upvoted" FROM "pages" WHERE "id" = 1

我检查过 - 它有效!