Lumen + Eloquent 6.X объединяются и объединяются в структуру JSON - PullRequest
0 голосов
/ 21 марта 2020

Рассматриваются две таблицы lectors, lessons и их модели Eloquent Lector и Lesson. Lectors содержание таблицы:

| id | name | 
| 1  | John |
| 2  | Jack |

Lessons содержимое таблицы:

| id | state | lector_id |
| 1  | new   | 1         |
| 2  | new   | 1         |
| 3  | old   | 1         |
| 4  | new   | 2         |

Я хотел бы запросить базу данных, чтобы получить список новых уроков и список старых уроков для каждый лектор. Пример вывода БД:

| id | name | count_new | count_old |
| 1  | John | 2         | 1         |
| 2  | Jack | 1         | 0         |

Я не особо разбираюсь в запросе на данном этапе. Я бы хотел, чтобы мой API возвращал результат JSON, как показано ниже. Это то, что я изо всех сил пытаюсь сделать с Lumen / Eloquent.

[
  {
    "id": 1,
    "name": "John",
    "count_new": 2,
    "count_old": 1
  },
  {
    "id": 2,
    "name": "Jack",
    "count_new": 1,
    "count_old": 0
  }
]

Мне интересен общий подход, позволяющий избежать запросов к таблицам по отдельности, а затем циклически перебирать вещи в коде, как я видел по всему инте rnet. Это кажется неправильным. Возможно ли это сделать с помощью API, доступного в Eloquent? Не нашел большой помощи в документах. Самый близкий, который я получил, был с subJoin с.

1 Ответ

0 голосов
/ 22 марта 2020

Ответ был в документах: https://laravel.com/docs/eloquent-relationships#counting -связанные модели

$result = Lector::withCount([
            'lessons as lessonsnew_count' => function (Builder $query) {
                $query->where('state', '=', 'new');
            },
            'lessons as lessons_old_count' => function (Builder $query) {
                $query->where('state', '=', 'old');
            }])->get();
...