Получение ресурса eloquent API с использованием метода сбора ключей

У меня есть конечная точка API

users/{user}

теперь в пользовательском ресурсе я хочу вернуться

     public function toArray($request)
        {
            // return parent::toArray($request);

            return [
                'id' => $this->id,
                'name' => $this->name,
//                'comments' => $this->post->comments->keyBy('post_id')
                'comments' => new CommentCollection($this->post->comments->keyBy->post_id)

            ];
        }

класс CommentCollection

public function toArray($request)
    {
        // return parent::toArray($request);

        return [
            'data' => $this->collection->transform(function($comment){
                return [
                    'id' => $comment->id,
                    'comment' => $comment->comment,
                ];
            }),
        ];
    }

но результат не будет включать post_id в качестве ключа, как я могу заставить его возвращать коллекцию комментариев с ключом post_id?

Обновить

use App\models\Post;
use App\Http\Resources\Postas PostResource;

Route::get('/posts', function () {
    return PostResource::collection(Post::all()->keyBy->slug);
});

Это работает правильно, но если я буду использовать коллекцию сообщений внутри пользовательского ресурса в качестве отношения, это не сработает! и это мое требование в коллекции комментариев.


person Prafulla Kumar Sahu    schedule 30.09.2019    source источник


Ответы (2)


Что я сделал, я создал еще один класс ResourceGroupCollection

<?php
namespace App\Http\Resources\Collection;

use Illuminate\Http\Resources\Json\ResourceCollection;

class CommentGroupCollection extends ResourceCollection
{
    public $collects = 'App\Http\Resources\Collection\CommentCollection';

    public $preserveKeys = true;

    public function toArray($request)
    {
        return $this->collection;
    }

}

<?php
namespace App\Http\Resources\Collection;

use Illuminate\Http\Resources\Json\ResourceCollection;

class CommentCollection extends ResourceCollection
{
    public $collects = 'App\Http\Resources\Comment';

    public $preserveKeys = true;

    public function toArray($request)
    {
        return $this->collection;
    }

}

and then 

new CommentGroupCollection($comments->groupBy('post_id')),
person Prafulla Kumar Sahu    schedule 04.10.2019

именно так :

     public function toArray($request)
        {
            // return parent::toArray($request);

            return [
                'id' => $this->id,
                'name' => $this->name,
//                'comments' => $this->post->comments->keyBy('post_id')
                'comments' => new CommentCollection($this->post->comments)->keyBy('post_id')

            ];
        }

person Mathieu Ferre    schedule 30.09.2019
comment
Как видите, у меня есть точный код, и он не работает, поэтому я разместил вопрос. - person Prafulla Kumar Sahu; 30.09.2019
comment
Можете ли вы опубликовать свой класс CommentCollection? - person Mathieu Ferre; 30.09.2019
comment
Не функция toArray(), она не будет использоваться в вашем случае, как она устроена? у вас есть столбец post_id в нем? Можете ли вы dd(new CommentCollection($this-›post-›comments)); ? - person Mathieu Ferre; 30.09.2019
comment
У меня есть некоторые обновления по моему вопросу, не могли бы вы изучить его, может быть, у нас будет какая-то подсказка. - person Prafulla Kumar Sahu; 01.10.2019
comment
Я нашел решение и разместил, может быть, вы хотели бы проверить. - person Prafulla Kumar Sahu; 04.10.2019