Laravel query LeftJoin show all categories even in right table 没有那个类别

Laravel query LeftJoin show all categories even in right table have not that category

我有两个 table 以下:

tb_category

id  |name      |
----------------
1   |Category A|
2   |Category B|
3   |Category C|
4   |Category D|
5   |Category E|

tb_sales
id |customer   |region       |product       |category
-------------------------------------------------------
1   James       Region A      Fruits         Category A
2   Billy       Region B      Vegetable      Category B
3   Benny       Region C      Computer       Category C
4   John        Region A      Table          Category D
5   Sarah       Region B      Fruits         Category A
6   James       Region A      Computer       Category C
7   Clara       Region B      Fruits         Category A
8   Benny       Region C      Vegetable      Category B
9   James       Region A      Vegetable      Category B
10  Billy       Region C      Fruits         Category A

我想创建查询和结果 table 如下 table 即使在 tb_sales 中所有类别计数和显示都没有类别。

No  |name           |Region A   |Region B   |Region C
-----------------------------------------------------
1   Category A         1          1           1
2   Category B         1          1           1
3   Category C         1          0           1
4   Category D         1          0           0
5   Category E         0          0           0

in my controller I have write like this:

            $cat = DB::table('tb_sales')
                ->leftJoin('tb_category','tb_category.name', '=', 'tb_sales.category')
                ->select(DB::raw('category, region, count(category) as c_Cat'))
                ->groupBy('category', 'region')
                ->get();

                return view('category', ['Category'=> $cat]);

谁能帮我解决这个问题..? 提前致谢。

基本上,您使用从 tb_sales 到类别的左连接,其中您想要检索所有类别及其区域。试试下面的代码

 $cat = DB::table('tb_category')
                ->leftJoin('tb_sales','tb_category.name', '=', 'tb_sales.category')
                ->select(DB::raw('category, region, count(category) as c_Cat'))
                ->groupBy('category', 'region')
                ->get();

我已经用 laracast @Tray2 的回答解决了。谢谢@Tray2。

使用这个查询:

SELECT c.name, 
         (SELECT count(s.*) from tb_sales s WHERE category = c.name AND s.region = 'Region A') AS region_a,
         (SELECT count(s.*) from tb_sales s WHERE category = c.name AND s.region = 'Region B') AS region_b,
             (SELECT count(s.*) from tb_sales s WHERE category = c.name AND s.region = 'Region C') AS region_c
FROM tb_category c
ORDER by c.name ASC

并将该查询传递给控制器​​:

$result = DB::select(<the query here>);

我希望这可以帮助有类似问题的人。