Laravel запрос LeftJoin показать все категории, даже в правой таблице не имеют этой категории - PullRequest
0 голосов
/ 21 января 2020

У меня есть две следующие таблицы:

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

Я хотел бы создать запрос и привести таблицу, подобную приведенной ниже таблице, в которой все категории отображаются и отображаются даже в 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]);

Может ли кто-нибудь помочь мне решить эту проблему? Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 17 апреля 2020

Я решил с ответом от 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>);

Я надеюсь, что это может помочь кому-то с подобной проблемой.

0 голосов
/ 21 января 2020

По сути, вы используете левое соединение из 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();
...