2017-05-05 53 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}]}')