如何在json列Laravel Postgres中查询包含给定元素的行

时间:2018-02-12 18:46:48

标签: php json postgresql laravel-5 laravel-5.3

大家好,我有一个postgresql表,其中有一个名为agents的json列。见下文

SELECT agents FROM cnms_rosters;

结果

      agents      
------------------
 [1,13,3,16,15]
 [12,13,14,15,15]
 [11,73,55,16,44]
(3 rows)

此列包含代理的ID。我想要做的是查询具有特定代理ID的行。

我怎样才能实现这一目标?

我目前正在使用Laravel Framework是否有任何雄辩的方法来查询数据?如果不是如何使用DB :: raw或其他查询构建器查询它。

2 个答案:

答案 0 :(得分:0)

您可以使用模型中的正则表达式搜索:

CnmsRoster::where('agents', '~', "/[^0-9]{$agent_id}[^0-9]/")

[^0-9]旨在匹配方括号或逗号。这使您可以在字符串中查找想要夹在控制字符之间的数字代理ID。

答案 1 :(得分:0)

sql查询将使用@>运算符,例如:

t=# with cnms_rosters(agents) as (values('[1,13,3,16,15]'::jsonb),('[12,13,14,15,15]'),('[11,73,55,16,44]'))
select agents FROM cnms_rosters where agents @> '[13]'::jsonb;
        agents
----------------------
 [1, 13, 3, 16, 15]
 [12, 13, 14, 15, 15]
(2 rows)

t=# with cnms_rosters(agents) as (values('[1,13,3,16,15]'::jsonb),('[12,13,14,15,15]'),('[11,73,55,16,44]'))
select agents FROM cnms_rosters where agents @> '[16]'::jsonb;
        agents
----------------------
 [1, 13, 3, 16, 15]
 [11, 73, 55, 16, 44]
(2 rows)

和数组相同:

t=# with cnms_rosters(agents) as (values(array[1,13,3,16,15]),(array[12,13,14,15,15]),(array[11,73,55,16,44]))
select agents FROM cnms_rosters where agents @> array[13];
      agents
------------------
 {1,13,3,16,15}
 {12,13,14,15,15}
(2 rows)

t=# with cnms_rosters(agents) as (values(array[1,13,3,16,15]),(array[12,13,14,15,15]),(array[11,73,55,16,44]))
select agents FROM cnms_rosters where agents @> array[16];
      agents
------------------
 {1,13,3,16,15}
 {11,73,55,16,44}
(2 rows)