Laravel两表组合查询:筛选无对应variant关联的product_types_values记录
两种方式都可实现,你可以根据业务场景选择即可:
方案1:基于现有变量直接处理(适合数据量小、且$variants已查询全量数据的场景)
注意:你当前代码中的$variants是paginate(10)分页查询结果,只能获取到当前页的10条数据,如果直接用该变量提取value做筛选,会因为数据不全导致筛选结果错误。如果你的业务场景本身就只需要基于当前页的variant做筛选,或者你把paginate(10)改成get()获取全量variant,可以用这个方案。
实现代码如下:
// 提取所有variant的value转为数组 $existVariantValues = $variants->pluck('value')->toArray(); // 筛选符合条件的product_types_values记录 $targetPtv = $products_types_values->filter(function ($ptv) use ($existVariantValues) { return !in_array($ptv->value, $existVariantValues); });
方案2:直接编写新的查询语句(更推荐,性能更高,避免分页坑)
如果你的$variants只是为了筛选ptv才查询,或者你需要基于全量variant数据筛选,直接用Eloquent子查询实现即可,不需要把全量数据拿到PHP层处理,数据库层面直接筛选效率更高,代码如下:
$targetPtv = ProductTypeValue::where('type_id', $product->type_id) ->whereNotIn('value', function ($query) use ($id) { $query->select('value') ->from('variants') ->where('id_type', 1) // 若id_type为动态值可替换为对应变量 ->where('id_product', $id); }) ->orderBy('value', 'asc') ->get();
如果你的页面其他逻辑还需要用到分页的$variants做展示,原来的$variants查询可以保留,和上面的筛选查询互不影响。
内容的提问来源于stack exchange,提问作者martibellot
相关产品推荐
相关产品推荐

