Один к Многим Посчитать с одним запросом? - PullRequest
0 голосов
/ 29 апреля 2018

Я давно не трогал бэкэнд ... так что простите, если это очень просто. Я работаю с Lumen v.5.6.1.

| table.sets     |    | table.indexed_items             |
|----------------|    |---------------------------------|
| ID | SET       |    | ID | setId | itemId | have      |    
|----|-----------|    |----|-------|--------|-----------|
| 1  | set name 1|    | 1  | 3     | 1      | 2         |
| 2  | set name 2|    | 2  | 3     | 2      | 1         |
| 3  | set name 3|    | 3  | 3     | 3      | 4         |
                      | 4  | 2     | 4      | 1         |
                      | 5  | 2     | 5      | 3         |
                      | 6  | 2     | 6      | 1         |

Как бы я возвратил в одном запросе groupedBy / Different по setId (с именем набора в качестве левого соединения?), Чтобы получить такой результат:

[
   setId: 2,
   name: 'set name 2',
   haveTotal: 5,
],
[
   setId: 3,
   name: 'set name 3',
   haveTotal: 7,
]

Ответы [ 3 ]

0 голосов
/ 29 апреля 2018

Если вы используете или хотите использовать eloquent, вы можете сделать что-то вроде:

$sets = App\Sets::withCount('indexed_items')->get();

Будет возвращена коллекция с именем столбца indexed_items_count

Очевидно, вам нужно будет изменить в зависимости от названия вашей модели.

Вот документы

0 голосов
/ 29 апреля 2018

Я всегда использую в своем проекте для учета судовых отношений.

$sets->indexed_items->count();
0 голосов
/ 29 апреля 2018

Вот необработанный запрос MySQL, который должен работать. Чтобы преобразовать это в Laravel, не должно быть слишком много работы, хотя вам, возможно, придется использовать DB::raw один или два раза.

SELECT
    s.ID AS setId,
    s.`SET` AS name,
    COALESCE(SUM(ii.have), 0) AS haveTotal
FROM sets s
LEFT JOIN indexed_items ii
    ON s.ID = ii.setId
GROUP BY
    s.ID;

Демо

Если вы не хотите возвращать наборы, не имеющие записей в таблице indexed_items, вы можете удалить вызов к COALESCE, а также использовать внутреннее соединение вместо левого.

Обратите внимание, что использование SET для именования ваших таблиц и столбцов не очень хорошая идея, поскольку это ключевое слово MySQL.

...