我的jsonb
数据库中有多个postgres
个数据字段。就像我的Contacts
表有name, addresses, phones and emails
作为jsonb数据字段一样。大多数jsonb
数据字段都是多维的。与emails
字段类似,不同的电子邮件类型具有不同的json数据。以下是我数据库中的示例电子邮件数据。
[
{"tag": "Home", "value": "foo@bar.com"},
{"tag": "Other", "value": "john@doe.net"},
{"tag": "Work", "value": "john@foo.com"},
{"tag": "Home", "value": "foo@gmail.com"}
]
我想对电子邮件字段的值数据执行搜索。就像我想在电子邮件领域中通过电子邮件john@doe.net
获取所有联系人一样。
我尝试使用普通信息获取联系人,例如
$contacts = Contact::where('emails->value', 'ilike', "%$query%")->get();
但它没有返回任何内容,这很明显,因为电子邮件字段是多维的。 虽然在单维json数据上,此查询可以正常工作。
在laravel eloquent
中搜索此类数据字段的正确方法是什么?如果可以在不使用whereRaw
jsonb_exists
函数的情况下 ,那就更好了。
答案 0 :(得分:1)
如果有人在将来需要帮助的话,我得到了它并且在这里发布了答案。
基本上我们可以使用where
运算符进行简单的@>
查询。并且值可以使用搜索到的电子邮件进行json编码。以下是不使用whereRaw
方法搜索特定电子邮件的查询。
$contacts = Contact::where("emails", '@>', '[' . json_encode(['value' => $query]) . ']')->get();
希望将来帮助其他人:)