JSON 列查询使用 laravel 生成器

JSON column query using laravel builder

我在 mysql 中有一个 json 列,我正在尝试使用 laravel 构建器查询该列。该列有一个 json 对象数组,我想查询该 json 对象中的值属性。

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}]

什么是$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]]);