JSON 带有查询生成器的值数组的 Where 子句
JSON Where Clause on array of values with Query Builder
这是 things
table 的 data
列中的 JSON 值:
{a: [{b: 1}, {b: 2}]}
我可以得到所有 things
包含等于 1 的 b
,原始查询如下:
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 (as of now) 在这些 "JSON where clauses" 中使用 ->
和 ->>
运算符(至少对于 PostgreSQL)。这不是你想要的。
但是PostgresGrammar
直接支持@>
和<@
运算符,所以你可以这样写:
Thing::where('data', '@>', '{"a":[{"b":1}]}')
这是 things
table 的 data
列中的 JSON 值:
{a: [{b: 1}, {b: 2}]}
我可以得到所有 things
包含等于 1 的 b
,原始查询如下:
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 (as of now) 在这些 "JSON where clauses" 中使用 ->
和 ->>
运算符(至少对于 PostgreSQL)。这不是你想要的。
但是PostgresGrammar
直接支持@>
和<@
运算符,所以你可以这样写:
Thing::where('data', '@>', '{"a":[{"b":1}]}')