使用 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 雄辩与查询构建器的优缺点

对 Laravel 查询构建器的 SQL 查询

Laravel 使用相等运算符查询 MySQL JSON 列

如何使用 Laravel 查询构建器跨表选择多个列?

Laravel - 使用 Eloquent 查询构建器在选择中添加自定义列

Laravel 查询构建器:如何访问 JSON 键/值对