Laravel计数类别加入

时间:2015-05-19 04:57:33

标签: mysql laravel join eloquent

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

表格是:products,product_colors和categories。

关系是products.category_id => categories.id和product_colors.product_id => products.id(按product_colors.color_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 - 有什么方法吗?

1 个答案:

答案 0 :(得分:0)

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

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)

编辑:我已经改写了Eloquent。

$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的事实。如果有人有替代方案,我将不胜感激。