Я пытаюсь создать 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');
}])
Возможно ли это или мне нужно перебрать мой первоначальный результат, чтобы добавить назвать детали?