Laravel查询:如何精准匹配数组数据获取cards表记录
严格匹配数组列元素的查询方案
场景说明
需要从cards表中筛选出colors列(存储为JSON数组格式)**仅包含指定颜色(White、Green)**的记录,无其他额外颜色。
Laravel 查询构造器实现
假设你使用Laravel框架,可通过以下代码实现:
$targetColors = $request->cardColor; // 对应值:["White", "Green"] $requiredCount = count($targetColors); $matchedCards = DB::table('cards') // 确保所有目标颜色都存在于colors数组中 ->where(function ($query) use ($targetColors) { foreach ($targetColors as $color) { $query->whereJsonContains('colors', $color); } }) // 限制colors数组的元素数量与目标颜色数量一致(避免包含额外颜色) ->whereRaw('JSON_LENGTH(colors) = ?', [$requiredCount]) ->get();
原生MySQL SQL语句
如果直接使用原生SQL,可执行以下查询:
SELECT * FROM cards WHERE JSON_CONTAINS(colors, '"White"') AND JSON_CONTAINS(colors, '"Green"') AND JSON_LENGTH(colors) = 2;
逻辑说明
- 检查目标颜色存在:通过
JSON_CONTAINS(原生SQL)或whereJsonContains(Laravel)逐一验证每个目标颜色都在colors数组内; - 限制数组长度:通过
JSON_LENGTH确保数组元素数量与目标颜色的数量完全一致,以此排除包含额外颜色的记录。
内容的提问来源于stack exchange,提问作者fufubrocat
相关产品推荐
相关产品推荐

