Извлечение красноречивого ресурса API с помощью метода сбора ключей - PullRequest
1 голос
/ 30 сентября 2019

У меня есть конечная точка 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 class

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);
});

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

Ответы [ 2 ]

1 голос
/ 04 октября 2019

Что я сделал, я создал другой класс 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')),
0 голосов
/ 30 сентября 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')

            ];
        }

...