如何在 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
我检查过 - 它有效!
我有一个任务:检查 $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
我检查过 - 它有效!