You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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();

通过原生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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 12:10:10