在 laravel elequent 中查询 json 列

Far*_*had 6 php mysql laravel mysql-json

我有一个名为的模型orders,它有一个infojson 列。在该 json 中我有一个名为 的属性id。现在我想检索 id 为 的所有订单6。所以这就是我的做法,如下所示:

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

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

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

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

Wah*_*nto 9

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

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

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

$order = DB::table('orders')
        ->where('info->id', $value)
        ->first();
Run Code Online (Sandbox Code Playgroud)

来自文档的附加信息:JSON Where Clauses

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

$users = DB::table('users')
    ->whereJsonContains('options->languages', 'en')
    ->get();
Run Code Online (Sandbox Code Playgroud)

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

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

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

$users = DB::table('users')
    ->whereJsonLength('options->languages', 0)
    ->get();
 
$users = DB::table('users')
    ->whereJsonLength('options->languages', '>', 1)
    ->get();
Run Code Online (Sandbox Code Playgroud)