可以使用 whereJsonContains 方法来查询 JSON 数组,请看示例。

1、查询数组元素中有 en

$users = DB::table('users')
                ->whereJsonContains('options->languages', 'en')
                ->get();

/*
JSON字段:
options = {
    "languages": ["de", "en", "fr"]
}

生成的SQL:
select * from `users` where json_contains(`options`, '"en"', '$."languages"')
*/

数组元素同时包含 ende

$users = DB::table('users')
                ->whereJsonContains('options->languages', ['en', 'de'])
                ->get();

/*
生成的SQL:
select * from `users` where json_contains(`options`, '["en","de"]', '$."languages"')
*/

2、如果被查询数组元素是一个对象,可以传入 PHP 数组来匹配对象属性:

$users = DB::table('users')
                ->whereJsonContains('favorites->books', ['name' => '西游记'])
                ->get();

/*
JSON字段:
favorites = {
    "books":[
        {"id": 123, "name": "西游记", "img": "http://test.com/asd.jpg"},
        {"id": 234, "name": "水浒传", "img": "http://test.com/qwe.jpg"},
        {"id": 456, "name": "红楼梦", "img": "http://test.com/xyz.jpg"}
    ]
}

生成的SQL:
select * from `users` where json_contains(`favorites`, '{"name":"西游记"}', '$."books"')
*/

匹配多个:

$users = DB::table('users')
                ->whereJsonContains('favorites->books', [['name' => '西游记'], ['name' => '红楼梦']])
                ->get();

/*
生成的SQL:
select * from `users` where json_contains(`favorites`, '[{"name":"西游记"},{"name":"红楼梦"}]', '$."books"')
*/

综上,其实 Laravel 就是将 whereJsonContains 转换成 SQL 的 json_contains 语句来执行。