2017-05-05 24 views
4

这里是一个things表的data列JSON值:JSON凡值的ARRAY子句与查询生成器

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

我可以得到所有things含有b即等于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'); 

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

+0

这[似乎Laravel与操作(https://github.com/laravel/framework/blob/7212b1e9620c36bf806e444f6931cf5f379c68ff /src/Illuminate/Database/Query/Grammars/PostgresGrammar.php#L256)这些“JSON where子句”中的' - >'和' - >>'操作符(这不是您想要实现的)。但是PostgresGrammar直接支持'@>'和'<@'运算符,所以(理论上)你可以编写' - > where('data','@>','{“a”:[{“b” :1}]}')' – pozs

+0

@pozs我刚刚检查过,你的“理论”有效!非常感谢你,我没有想到这个,我正在写一个whereRaw查询。你可以发表你的评论作为答案,我会接受它:) –

回答

1

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

PostgresGrammar直接支持@><@运营商,所以你可以写:

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