问题:JSON Where 子句与查询生成器的值数组

这是things表的data列中的 JSON 值:

{a: [{b: 1}, {b: 2}]}

我可以使用这样的原始查询获取所有包含bthings等于 1:

select * from things where data @> '{ "a": [{"b": 1}] }';

我知道我们可以使用 Laravel 使用带有 JSON where 子句的 Laravel 运行查询:https://laravel.com/docs/5.4/queries#json-where-clauses。我可以写如下内容:

Thing::where('a->c', 'foobar');

但是我可以写一个 where 来检查a是否包含{b: 1}就像在 Laravel 的查询生成器的原始查询中一样?

解答

Laravel(现在是)在这些“JSON where 子句”中使用->->>运算符(至少对于 PostgreSQL)。这不是你想要达到的。

但是PostgresGrammar直接支持@><@运算符,所以你可以这样写:

Thing::where('data', '@>', '{"a":[{"b":1}]}')
Logo

PostgreSQL社区为您提供最前沿的新闻资讯和知识内容

更多推荐