Красноречивые соединения и суммы - PullRequest
0 голосов
/ 29 мая 2018

У меня есть 2 таблицы, и я хотел бы получить запрос, который получает все столбцы из таблицы 'projects' и несколько сумм из таблицы 'invoices' на основе поля 'type'.

projects
+----+--------+------+--------+
| ID | Address| Date | Other  |
+----+--------+------+--------+
|  1 | demo   | date | other  |
|  2 | demo2  | date2| other2 |

invoices
+----+---------+-----+--------+
| ID | proj_id | type| amount |
+--------------+-----+--------+
| 1  |   1     | a   |   10   |
| 2  |   1     | a   |   20   |
| 3  |   1     | b   |   10   |
| 4  |   1     | b   |   15   |
| 5  |   1     | c   |   5    |
| 6  |   2     | a   |   30   |
| 7  |   2     | a   |   5    |
| 8  |   2     | b   |   30   |
| 9  |   2     | c   |   5    |
| 10 |   2     | c   |   30   |

ИспользованиеLaravel Eloquent Я хочу получить:

+----+---------+------+-------+---+---+---+
| ID | Address | Date | Other | a | b | c |
+----+---------+------+-------+---+---+---+
|  1 | demo    | date | other |30 |25 | 5 |
|  2 | demo2   | date2| other2|35 |30 |35 |

Я застрял с суммой, ну, на самом деле, со всем этим!

Пока у меня есть:

$projects = DB::table('projects')           
        ->leftJoin('invoices', 'projects.id', '=', 'invoices.project_id')
        ->select('projects.*', 'invoices.*')
        ->get();

Что, очевидно, не очень далеко впереди!Любая помощь будет принята с благодарностью!

1 Ответ

0 голосов
/ 29 мая 2018

Здесь вам нужен базовый сводный запрос.Вероятно, проще всего было бы воспользоваться необработанным выбором:

$sql = "projects.*, ";
$sql .= "sum(case when invoices.type = 'a' then invoices.amount end) as a, ";
$sql .= "sum(case when invoices.type = 'b' then invoices.amount end) as b, ";
$sql .= "sum(case when invoices.type = 'c' then invoices.amount end) as c";

$projects = DB::table('projects')
    ->select(DB::raw($sql))
    ->leftJoin('invoices', 'projects.id', '=', 'invoices.project_id')
    ->groupBy('project.id')
    ->get();

Это должно соответствовать следующему необработанному запросу MySQL:

SELECT
    p.*,
    SUM(CASE WHEN i.type = 'a' THEN i.amount END) AS a,
    SUM(CASE WHEN i.type = 'b' THEN i.amount END) AS b,
    SUM(CASE WHEN i.type = 'c' THEN i.amount END) AS c
FROM project p
LEFT JOIN invoices I
    ON p.id = i.project_id
GROUP BY
    p.id;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...