Объединение в объединение и подсчет записей с использованием SQL в Laravel - PullRequest
0 голосов
/ 29 октября 2019

Этот запрос SQL для моего проекта Laravel оказался в тупике, поэтому сначала я опишу отношения.

cartages имеет следующие поля: id, date_ending

cartage_batches имеет следующее: id, cartage_id

cartage_items имеет следующее: id, batch_id, amount

Что бы яНапример, можно сделать запрос к таблице cartage, которая будет сгруппирована по году и месяцу, извлеченным из поля date_weekending. Но также захватите счет cartage_items в cartage_batches в каждом месяце cartages.

Я знаю, что это будет связано с объединением в объединении, но я не совсем уверен, как добиться этого лучше всего изв пределах Laravel.

Пример данных:

Cartage

id   date_ending
1    2019-01-01
2    2019-01-08
3    2019-03-04

Cartage_Batches

id   cartage_id
1    1
2    1
3    1
4    2
5    2

Cartage_Items

id   batch_id   amount
1    1          20.00
2    2          5.00
3    2          15.00
4    4          13.00

Ожидаемый результат

2019-01 => ['count' => 4],
2019-03 => ['count' => 0]

1 Ответ

2 голосов
/ 29 октября 2019

Вот необработанный запрос MySQL, который должен сгенерировать желаемый результат:

SELECT
    DATE_FORMAT(c.date_ending, '%Y-%m') AS ym,
    COUNT(ci.batch_id) AS count
FROM Cartage c
LEFT JOIN Cartage_Batches cb
    ON cb.cartage_id = c.id
LEFT JOIN Cartage_Items ci
    ON ci.batch_id = cb.id
GROUP BY
    DATE_FORMAT(c.date_ending, '%Y-%m');

screen capture of demo

Демо

Вот как может выглядеть ваш код Laravel:

$result = DB::table('Cartage c')
    ->leftJoin('Cartage_Batches cb', 'cb.cartage_id', '=', 'c.id')
    ->leftJoin('Cartage_Itmes ci', 'ci.batch_id', '=', 'cb.id')
    ->groupBy(DB::raw("DATE_FORMAT(c.date_ending, '%Y-%m')"))
    ->select(DB::raw("DATE_FORMAT(c.date_ending, '%Y-%m'), COUNT(ci.batch_id) AS count"))
    ->get();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...