Far*_*had 6 php mysql laravel mysql-json
我有一个名为的模型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();
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 有什么问题
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)
归档时间: |
|
查看次数: |
3631 次 |
最近记录: |