使用 laravel 构建器的 JSON 列查询
Posted
技术标签:
【中文标题】使用 laravel 构建器的 JSON 列查询【英文标题】:JSON column query using laravel builder 【发布时间】:2022-01-16 07:39:31 【问题描述】:我在 mysql 中有一个 json 列,我正在尝试使用 laravel bulider 查询该列。该列有一个 json 对象数组,我想查询该 json 对象中的 Value 属性。
use Illuminate\Database\Eloquent\Builder;
class SizeFilter
public function filter(Builder $builder, $value): Builder
return $builder->whereJsonContains('sizes',[['Value' => $value]]);
而我的json列结构是
["SizeID":34,"Sku":null,"Value":"10","stock":2,"SizeID":35,"Sku":null,"Value":"12","stock":0,"SizeID":36,"Sku":null,"Value":"14","stock":0,"SizeID":37,"Sku":null,"Value":"16","stock":0,"SizeID":38,"Sku":null,"Value":"18","stock":0,"SizeID":32,"Sku":null,"Value":"6","stock":0,"SizeID":33,"Sku":null,"Value":"8","stock":1]
【问题讨论】:
【参考方案1】:$value
是什么?它必须是一个字符串。如果是整数,则 JSON 搜索将不起作用。
我没有 Laravel,但是我在 MySQL 客户端测试过:
mysql> set @j = '...'; -- your example JSON
mysql> select json_contains(@j, '"Value":"10"');
+-------------------------------------+
| json_contains(@j, '"Value":"10"') |
+-------------------------------------+
| 1 |
+-------------------------------------+
1 row in set (0.00 sec)
mysql> select json_contains(@j, '"Value":10');
+-----------------------------------+
| json_contains(@j, '"Value":10') |
+-----------------------------------+
| 0 |
+-----------------------------------+
所以请确保它是一个字符串:
return $builder->whereJsonContains('sizes',[['Value' => (string) $value]]);
【讨论】:
感谢您的建议。有效!我传递给过滤器函数的 $value 是一个数组,这就是我从该查询中注意到的原因以上是关于使用 laravel 构建器的 JSON 列查询的主要内容,如果未能解决你的问题,请参考以下文章
Laravel 使用相等运算符查询 MySQL JSON 列