如何在Laravel中查询MySQL列存储的数组实现产品颜色筛选
Laravel实现JSON数组列的颜色筛选方案
你的products表中primary_colors列以JSON数组格式存储颜色ID,用户筛选时传入包含多个颜色ID的数组,以下是两种常见需求的实现方式:
1. 筛选包含任意一个选中颜色的产品
只要产品的primary_colors包含用户选中的任意一个颜色即匹配,有两种实现方法:
方法一:循环添加orWhereJsonContains
$selectedColors = request()->input('primary_color', []); $query = \App\Models\Product::query(); foreach ($selectedColors as $color) { $query->orWhereJsonContains('primary_colors', $color); } $products = $query->get();
方法二:使用whereRaw配合JSON_SEARCH
通过原生SQL函数一次性检查是否存在匹配元素,避免循环:
$selectedColors = request()->input('primary_color', []); if (!empty($selectedColors)) { $products = \App\Models\Product::whereRaw( 'JSON_SEARCH(primary_colors, "one", ?) IS NOT NULL', [implode('","', $selectedColors)] )->get(); } else { $products = \App\Models\Product::all(); }
2. 筛选包含所有选中颜色的产品
要求产品的primary_colors同时包含用户选中的所有颜色,分版本处理:
方法一:Laravel 8.70+ 用whereJsonContainsAll
高版本Laravel提供了原生支持的方法,直接检查JSON数组是否包含所有指定元素:
$selectedColors = request()->input('primary_color', []); $products = \App\Models\Product::whereJsonContainsAll('primary_colors', $selectedColors)->get();
方法二:低版本Laravel循环添加whereJsonContains
低版本没有whereJsonContainsAll,可以通过循环添加AND条件的whereJsonContains实现:
$selectedColors = request()->input('primary_color', []); $query = \App\Models\Product::query(); foreach ($selectedColors as $color) { $query->whereJsonContains('primary_colors', $color); } $products = $query->get();
注意事项
- 确保数据库支持JSON字段操作(如MySQL 5.7+、PostgreSQL等)
- 注意颜色ID的类型匹配:如果
primary_colors存储的是数值数组(如[5,7,11]),传入的参数也要是数值类型,否则会匹配失败 - 处理空数组的情况,避免生成无效查询条件
内容的提问来源于stack exchange,提问作者aliha nazeer
相关产品推荐
相关产品推荐

