php - PostgreSQL 上的教义:如果具有值数组的 jsonb 字段包含传递的值,如何选择一行
问题描述
我在 PostgreSQL 上。
我有一个 Doctrine 实体FruitEntity
,其中包括两个字段:
id
主键是字母数字string
(例如:)apple
;aliases
是一个jsonb
字段并包含替代 ID 列表:(例如:["orange","banana""cherry"]
apple
如果我通过值,我想选择 ID = 的行banana
。
所以,这就是FruitRepository
课程(我在 Symfony 上):
class FruitRepository extends ServiceEntityRepository
{
public function __construct(ManagerRegistry $registry)
{
parent::__construct($registry, FruitEntity::class);
}
public function myMethod(string $fruitName)
{
$result = $this->createQueryBuilder('f')
->select('f.id')
->andWhere('f.id = :fruitName')
->orWhere("JSON_EXTRACT(f.aliases, '$.:fruitName')")
->setParameter('fruitName', $fruitName)
->getQuery()
->getScalarResult();
...
}
}
此代码生成此 DQL 查询:
SELECT f.id FROM App\Entity\FruitEntity f WHERE f.id = :fruitName OR JSON_EXTRACT(f.aliases, '$.:fruitName')
这显然是错误的,它产生的错误就是这个
注意:尝试访问 null 类型值的数组偏移量
如何选择 IDapple
传递列orange
中存在的值的aliases
行?
解决方案
好的,最后我这样解决了:
$result = $this->createQueryBuilder('f')
->select('f.id')
->andWhere('c.id = :fruitName')
->orWhere("JSONB_CONTAINS(f.aliases, '\"" . $fruitName . "\"') = true")
->setParameter('fruitName', $fruitName)
->getQuery()
->getScalarResult();
使用这些函数时,参数似乎没有被转换。
另请注意,我使用JSONB_CONTAINS
而不是JSON_EXTRACT
.
仅供参考,我显然用过scienta/doctrine-json-functions
推荐阅读
- unit-testing - 如何在 Flutter 中模拟 VideoPlayerController.network()
- excel - 如何在不扭曲结果的情况下复制excel中的计算结果,然后将其从列转置为原始?
- r - 通过按 R 中的值过滤列来应用 glm()
- reactjs - 反应 - 通过特定数组映射取决于 url
- python - Tkinter 条目小部件验证
- swift - 如何在 Mac Catalyst 中调整警报的窗口大小?
- excel - 在更多列中合并数据验证代码
- flutter - 颤振警报对话框未从函数外部更新
- angular - 角度在本地存储中的对象内添加对象
- keras - Keras:从现有神经网络创建自定义 RNN 单元