如何在Laravel Builder中按关联数量过滤符合条件的产品模型
获取有效产品的SQL查询方案
可以通过以下两种SQL查询方式直接从数据库层面筛选出符合条件的有效产品,无需取出全部数据后再用代码过滤:
方法一:关联表后分组统计
通过JOIN关联三张表,再用GROUP BY和HAVING子句统计并过滤符合数量要求的产品:
SELECT p.* FROM products p JOIN product_images pi ON p.product_id = pi.product_id JOIN variants v ON p.product_id = v.product_id GROUP BY p.product_id HAVING COUNT(DISTINCT pi.image_id) >= 4 AND COUNT(DISTINCT v.variant_id) >= 3;
- 用
DISTINCT是为了避免关联时产生笛卡尔积导致重复统计同一张图片或变体; - 替换
product_id、image_id、variant_id为你实际使用的主键/外键字段名即可。
方法二:子查询预统计数量
先通过子查询分别筛选出满足图片、变体数量要求的产品ID,再与主表关联获取完整产品信息,这种方式在数据量大时性能更优:
SELECT p.* FROM products p JOIN ( SELECT product_id, COUNT(image_id) AS image_count FROM product_images GROUP BY product_id HAVING image_count >= 4 ) pi_count ON p.product_id = pi_count.product_id JOIN ( SELECT product_id, COUNT(variant_id) AS variant_count FROM variants GROUP BY product_id HAVING variant_count >= 3 ) v_count ON p.product_id = v_count.product_id;
- 子查询先完成数量筛选,只保留符合条件的产品关联关系,减少主查询的计算量。
内容的提问来源于stack exchange,提问作者Melly
相关产品推荐
相关产品推荐

