使用 Laravel 在 Json 列中搜索

use*_*002 12 php mysql json laravel laravel-5

在我的电子邮件表中,我有一列名为Tocolumn-type Json。这是值的存储方式:

[
    {
        "emailAddress": {
            "name": "Test", 
            "address": "test@example.com"
        }
    }, 
    {
        "emailAddress": {
            "name": "Test 2", 
            "address": "test2@example.com"
        }
    }
]
Run Code Online (Sandbox Code Playgroud)

现在我想要发送到“test@example.com”的所有电子邮件的集合。我试过:

DB::table('emails')->whereJsonContains('to->emailAddress->address', 'test@example.com')->get();
Run Code Online (Sandbox Code Playgroud)

(参见https://laravel.com/docs/5.7/queries#json-where-clauses)但我没有得到匹配。有没有更好的方法来使用 Laravel (Eloquent) 进行搜索?

在调试栏中,我可以看到这个查询被“翻译”为:

select * from `emails` where json_contains(`to`->'$."emailAddress"."address"', '\"test@example.com\"'))
Run Code Online (Sandbox Code Playgroud)

Jon*_*eir 21

箭头运算符在数组中不起作用。改用这个:

DB::table('emails')
   ->whereJsonContains('to', [['emailAddress' => ['address' => 'test@example.com']]])
   ->get()
Run Code Online (Sandbox Code Playgroud)

  • @EvanLalo 不,MySQL 不支持。 (2认同)
  • 您好,它工作正常,您可以分享参考文档吗? (2认同)

小智 9

我没有使用 json 列,但正如文档所指,下面的代码应该可以正常工作。

DB::table('emails')
  ->where('to->emailAddresss->address','test@example.com')
  ->get();
Run Code Online (Sandbox Code Playgroud)


Nas*_*imi 8

如果以 json 格式存储数组。只需要一个 ID 数组列表,我就这样做了。

items 是列名,$item_id 是我搜索的术语

// $item_id = 2
// items = '["2","7","14","1"]'
$menus = Menu::whereJsonContains('items', $item_id)->get();
Run Code Online (Sandbox Code Playgroud)