在 laravel 雄辩的 json 列内查询

Querying inside json column in laravel elequent

我有一个名为 orders 的模型,它有一个 info json 列。 在那个 json 我有一个 属性 叫做 id 。例如,现在我想检索 ID 为 6 的所有订单。所以我是这样做的:

  $order = \DB::table('orders')
                ->where('info.id',$value)
               // ->where('info->id',$value)
//            ->whereRaw('JSON_EXTRACT(`info` , "$.id") = '.$value)
                ->first();

第三个 whereRaw 正在工作,但我认为它有一个错误,因为在我的验证第三个或第四个 returns 这个错误太奇怪了:

Column not found: 1054 Unknown column '6112 ' in 'where clause' (SQL: select * from `orders` where JSON_EXTRACT(`info` , "$.id") = 6112  limit 1)

它是如何将列值误认为列名的,这很奇怪,因为当我 dd 我从查询中获取值时它在第一个上工作,但它像第 4 个一样中断。 现在我想知道是否有更简单的解决方案可以在 json 字段上使用 where 或者 whereRaw

有什么问题

Laravel 支持在支持 JSON 列类型的数据库上查询 JSON 列类型。

目前,这包括 MySQL 5.7+、PostgreSQL、SQL Server 2016 和 SQLite 3.9.0(带有 JSON1 extension ).

要查询 JSON 列,请使用 -> 运算符:

$order = DB::table('orders')
        ->where('info->id', $value)
        ->first();

文档中的其他信息:JSON Where Clauses

您可以使用 whereJsonContains 查询 JSON 数组。 SQLite 数据库不支持此功能:

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

如果您的应用程序使用 MySQL 或 PostgreSQL 数据库,您可以将值数组传递给 whereJsonContains 方法:

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

您可以使用 whereJsonLength 方法按长度查询 JSON 个数组:

$users = DB::table('users')
    ->whereJsonLength('options->languages', 0)
    ->get();
 
$users = DB::table('users')
    ->whereJsonLength('options->languages', '>', 1)
    ->get();