一对多只有一个查询?

时间:2018-04-29 03:43:25

标签: mysql laravel laravel-5 lumen

我有一段时间没有触及后端..如果这非常简单,请原谅我。我正在使用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         |

我如何在一个查询中返回,由setId(set set as left join?)groupBy / distinct返回以获得如下返回:

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

3 个答案:

答案 0 :(得分:1)

这是一个应该有效的原始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;

Demo

如果您不想返回indexed_items表中没有条目的集,那么您可以删除对COALESCE的呼叫,也可以使用内部联接而不是离开加入。

请注意,使用SET命名表和列并不是一个好主意,因为它是一个MySQL关键字。

答案 1 :(得分:1)

如果您正在使用或想要使用雄辩,您可以执行以下操作:

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

这将返回一个列名为indexed_items_count

的集合

显然,您需要根据型号名称进行更改。

Here are the docs

答案 2 :(得分:1)

我总是在我的项目中使用计数关系船记录。

$sets->indexed_items->count();