ответ действительно возвращает результат указанный в вопросе, но согласитесь что такой монстр не может применяться на практике.
Программирование это искусство компромисса между желаемым и реальным.
Я предложил свой вариант решения проблемы, автор вопроса принял это как возможное решения
Вы выставили себя мелким завистником.
И в итоге остановился на Laravel и mysql только вчера понял что без особых мучений можно сформировать подобный json с помощью Eloquent: API Resources и Eloquent: Relationships
SELECT
posts.id,
posts.title,
posts.description,
posts.created_at,
users.id,
users.avatar,
users.firstname,
users.lastname,
COUNT(likes.id) AS 'count_likes',
IF(COUNT(likes.id) = 0, NULL, JSON_ARRAYAGG(JSON_OBJECT(
'firstname', likes_users.firstname,
'lastname', likes_users.lastname,
'avatar', likes_users.avatar
))) AS 'likes'
FROM posts
JOIN users ON users.id = posts.user_id
LEFT JOIN likes ON likes.post_id = posts.id
LEFT JOIN users AS likes_users ON likes_users.id = likes.user_id
WHERE
users.id = 1
GROUP BY
posts.id,
posts.title
IF(COUNT(likes.id) = 0, NULL, JSON_ARRAYAGG(JSON_OBJECT(
[{
avatar: null,
firstname: null,
lastname: null
}]
Если речь о том, что в массиве stocks не надо сохранять ключи, то и переиндексируйте этот массив:
Обновил ответ.