【问题标题】:JSON Where Clause on array of values with Query Builder带有查询生成器的值数组的 JSON Where 子句
【发布时间】:2017-10-03 15:43:58
【问题描述】:

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

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

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

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

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

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

但是我可以写一个地方来检查a 是否包含{b: 1},就像在使用 Laravel 的查询构建器的原始查询中一样?

【问题讨论】:

  • 这些“JSON where 子句”中的 seems that Laravel operates with ->->> 运算符(这不是您想要实现的)。但是 PostgresGrammar 直接支持 @><@ 运算符,所以(理论上)你可以写 ->where('data', '@>', '{"a":[{"b":1}]}')
  • @pozs 我刚刚检查过,你的“理论”有效!非常感谢我没有考虑这个,我正在写一个 whereRaw 查询。你可以发表你的评论作为答案,我会接受的:)

标签: postgresql laravel laravel-5 laravel-5.4 postgresql-json


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-09
    • 1970-01-01
    • 2023-01-31
    • 1970-01-01
    • 1970-01-01
    • 2021-06-23
    相关资源
    最近更新 更多