оставленная сумма объединить несколько столов laravel6 - PullRequest
0 голосов
/ 12 марта 2020

У меня есть 3 таблицы, таблица зарплат (id, имя) и pointages (id, datep, salarie_id, sold) и avances (id, montantA, salarie_id).

таблицы зарплат

Id  name
1   kamal   
2   imad 

таблица pointages

id  datep       Salarie_id  sold
1   11/03/2020      1        120
2   05/03/2020      1        100
3   06/03/2020      2        50
4   07/03/2020      2        20

таблица avances

id  datea         montantA    Salarie_id
1   11/03/2020    120          1
2   02/03/2020    50           1

по этим 3 таблицам я хочу восстановить salaries.id и salaries.name и сумму (pointages.sold) и сумму ( avances.montantA) вот так

Salarie.id  Salaries.nom    Sum(sold)   Sum(montantA)
1              kamal           220          170
2              imad            70           0

когда я выполняю запрос mysql, он дает мне точный результат:

SELECT 
s.id AS 'Salarie.id', 
s.nom AS 'Salarie.nom', 
COALESCE(p.somme, 0) AS 'SUM(sold)', 
 COALESCE(a.somme, 0) AS 'SUM(montantA)' 
FROM 
Salaries s 
 LEFT JOIN (SELECT SUM(sold) AS somme, salarie_id FROM pointages GROUP BY salarie_id) AS p ON p.salarie_id = s.id
 LEFT JOIN (SELECT SUM(montantA) AS somme, salarie_id FROM avances GROUP BY salarie_id) AS a ON a.salarie_id = s.id
GROUP BY s.id, p.salarie_id, a.salarie_id

теперь я хочу написать этот запрос в функции состояния SalarieController и я не знаю, как

1 Ответ

1 голос
/ 13 марта 2020

Ваш необработанный sql может использоваться построителем запросов следующим образом:

$p = DB::table('pointages')
        ->groupBy('salarie_id')
        ->selectRaw('SUM(sold) AS somme, salarie_id');

$a = DB::table('avances')
        ->groupBy('salarie_id')
        ->selectRaw('SUM(montantA) AS somme, salarie_id');

DB::table('Salaries AS s')
    ->leftJoin(DB::raw("({$p->toSql()}) AS p"), 'p.salarie_id', '=', 's.id')
    ->leftJoin(DB::raw("({$a->toSql()}) AS a"), 'a.salarie_id', '=', 's.id')
    ->groupBy('s.id', 'p.salarie_id', 'a.salarie_id')
    ->selectRaw('s.id AS "Salarie.id", 
              s.nom AS "Salarie.nom", 
              COALESCE(p.somme, 0) AS SUM(sold), 
              COALESCE(a.somme, 0) AS SUM(montantA)')
    ->get();

Или вы можете использовать leftjoin без подзапроса:

DB::table('Salaries AS s')
   ->leftJoin('pointages AS p', 'p.salarie_id', '=', 's.id')
   ->leftJoin('avances AS a', 'a.salarie_id', '=', 's.id')
   ->groupBy('s.id')
   ->selectRaw('s.id AS "Salarie.id",
                s.name AS "Salaries.nom",
                SUM(p.sold),
                SUM(a.montantA)')
   ->get();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...