使用Laravel在Json列中搜索

时间:2018-12-05 21:59:38

标签: php mysql json laravel laravel-5

在我的电子邮件表中,我有一列名为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\"'))

4 个答案:

答案 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();