Mysql 拉威尔计数类别联接

Mysql 拉威尔计数类别联接,mysql,laravel,join,eloquent,Mysql,Laravel,Join,Eloquent,我有三个表需要最终查询,我正在寻找最有效的方法 表格包括:产品、产品颜色和类别 这些关系是products.category\u id=>categories.id和product\u colors.product\u id=>products.id(按product\u colors.color\u id过滤) 首先,我有一个产品表,该产品与颜色表有一对多的关系,所以我需要根据颜色对其进行过滤。 其次,我需要按类别对其进行筛选,并返回适合的每个类别中的产品数量 我有下面的查询,它将最终统计我想

我有三个表需要最终查询,我正在寻找最有效的方法

表格包括:产品、产品颜色和类别

这些关系是products.category\u id=>categories.id和product\u colors.product\u id=>products.id(按product\u colors.color\u id过滤)

首先,我有一个产品表,该产品与颜色表有一对多的关系,所以我需要根据颜色对其进行过滤。 其次,我需要按类别对其进行筛选,并返回适合的每个类别中的产品数量

我有下面的查询,它将最终统计我想要的每个类别中的产品,但它不会根据第一个颜色过滤器进行过滤

SELECT categories.name, SUM(IF(category_id IS NULL, 0, 1)) AS categories         
FROM products     JOIN categories ON (categories.id = products.category_id) 
WHERE(products.gender = 1)     GROUP BY categories.id;
我不太熟悉在查询或连接方面什么是有效的,什么是无效的,但是我想得到的可能是一个与被过滤颜色匹配的产品ID列表,然后以某种方式在这些ID上进行连接


编辑:在我下面的回答中,我提出了一个解决方案,但它使用了DB:raw——有什么办法吗?

我设法提出了以下查询,它将有效地返回我需要的内容,并可以选择按性别排序

mysql> SELECT categories.name, SUM(IF(category_id IS NULL, 0, 1)) AS 
categories FROM products LEFT JOIN product_colors ON 
(product_colors.product_id = products.id) LEFT OUTER JOIN categories 
ON (categories.id = products.category_id) WHERE(products.gender = 1 AND 
product_colors.color_id = 1) GROUP BY categories.id;


+--------------+------------+
| name         | categories |
+--------------+------------+
| トップス     |         35 |
| アウター     |          1 |
| ボトムス     |          7 |
| シューズ     |         21 |
| 帽子         |          2 |
+--------------+------------+
5 rows in set (0.00 sec)
编辑:我在里面写得很有说服力

$categories = Category::select('categories.name',DB::raw('SUM(IF(category_id     IS NULL, 0, 1)) AS categories'))
        ->join('products','categories.id','=','products.category_id')
        ->join('product_colors','product_colors.product_id','=','products.id','left outer')
        ->where('products.gender','=',1)
        ->where('product_colors.color_id','=',1)
        ->groupBy('categories.id')
        ->get();
总的来说,我觉得这个解决方案还不错,但我不喜欢它使用DB:raw。如果有人有其他选择,我将不胜感激