在我的电子邮件表中,我有一列名为To
,列类型为Json
。值的存储方式如下:
[{"emailAddress": {"name": "Test", "address": "test@example.com"}}, {"emailAddress": {"name": "Test 2", "address": "test2@example.com"}}]
现在,我希望收集发送到“ test@example.com”的所有电子邮件。我尝试过:
DB::table('emails')->whereJsonContains('to->emailAddress->address', 'test@example.com')->get();
(请参阅https://laravel.com/docs/5.7/queries#json-where-clauses) 但我没有比赛。是否有更好的方法使用Laravel(口才)进行搜索?
在调试栏中,我可以看到此查询被“翻译”为:
select * from `emails` where json_contains(`to`->'$."emailAddress"."address"', '\"test@example.com\"'))
答案 0 :(得分:2)
箭头运算符不适用于数组。改用它:
DB::table('emails')
->whereJsonContains('to', [['emailAddress' => ['address' => 'test@example.com']]])
->get()
答案 1 :(得分:1)
我没有使用json列,但是正如文档所指,下面的代码应该可以正常工作。
DB::table('emails')
->where('to->emailAddresss->address','test@example.com')
->get();
答案 2 :(得分:1)
您可以在条件类似的条件下使用where子句
DB::table('emails')->where('To','like','%test@example.com%')->get();
或者,如果您已将Model映射为使用口才的电子邮件表名,则为电子邮件
Email::where('To','like','%test@example.com%')->get();
答案 3 :(得分:0)
如果以json格式存储数组。并且只有一个 ID 数组列表,我做到了。
<块引用>items 是列名,$item_id 是我搜索的词
// $item_id = 2
// items = '["2","7","14","1"]'
$menus = Menu::whereJsonContains('items', $item_id)->get();