Можно ли создать 3 вложенных слоя в одном запросе Eloquent? - PullRequest
0 голосов
/ 25 апреля 2020

Я пытаюсь создать json для ответа Ajax для Vue внешнего интерфейса, представляющего систему реакций, вывод, подобный тому, что вы можете видеть в Facebook. У поста есть типы реакции (например, любовь, злость), и у каждого из этих типов реакции будут пользователи, которые зарегистрировали эту реакцию.

Вывод, который я ищу для того, чтобы сохранить большую часть работы в контроллере, чтобы интерфейс не должен был l oop пройти через вывод до общего количества операций, выглядит следующим образом:

[
  {
    "id": 258,
    "reactions": [
      {
        "type": "like",
        "count": 2,
        "names": [
          {
            "user_id": 1,
            "first_name": "Drew",
          },
          {
            "user_id": 2,
            "first_name": "Kathy",
          }
        ]
      },
      {
        "type": "angry",
        "count": 3,
        "names": [
          {
            "user_id": 3,
            "first_name": "Bob",
          },
          {
            "user_id": 4,
            "first_name": "Fred",
          },
          {
            "user_id": 5,
            "first_name": "Anne",
          }
        ]
      }
    ],
  }
] 

Я могу легко получить первые два слоя:

return Post::latest()
    ->with('user:id,first_name')
    ->with(['postReactions' => function($query) {
        $query->select(DB::table('post_reactions'))
            ->select('post_id', 'type', DB::raw('count(*) as count'))
            ->groupBy('post_id', 'type');
    }])

И я смог сделать различные версии этого с детализацией на втором уровне, но без суммарного количества.

В своей голове я хочу добавить вложенное «с» в подзапросе postReactions, что-то вроде:

return Post::latest()
    ->with('user:id,first_name')
    ->with(['postReactions' => function($query) {
        $query->select(DB::table('post_reactions'))
            ->select('post_id', 'type', DB::raw('count(*) as count'))
            ->groupBy('post_id', 'type');
        $query->with('user:id,first_name');
    }])

Возможно ли это или мне нужно перебрать мой первоначальный результат, чтобы добавить назвать детали?

1 Ответ

0 голосов
/ 25 апреля 2020

Для вас есть встроенный метод withCount () .

Что касается вложенных отношений, они получат желаемую структуру, если вы соедините вложенные отношения с помощью соглашения точек:

->with('reactions.names')

Конечно, я предполагаю, что это настоящие имена ваших отношений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...