如何自定义Laravel的CollectionAPI资源?

How to customize Laravel's Collection API resources?

我尝试了以下但它不起作用:

ArticleController.php:

public function index()
    {
        $articles = Article::latest()->paginate(10);
        return ArticleCollection::collection($articles);
    }

ArticleCollection.php:

<?php

namespace App\Http\Resources;

use Illuminate\Http\Resources\Json\ResourceCollection;

class ArticleCollection extends ResourceCollection
{
    /**
     * Transform the resource collection into an array.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return array|\Illuminate\Contracts\Support\Arrayable|\JsonSerializable
     */
    public function toArray($request)
    {
        return [
            'name' => $this->title,
            'subtitle' => $this->subtitle,
            'cover' => $this->cover,
        ];
    }
}

这种模型转换似乎适用于单个模型,但不适用于 collection。我应该如何自定义在使用 collections API 资源时将返回哪些字段?

你可以这样使用它:

return new ArticleCollection($articales); 

让您的数据库查询定义最终字段

这样检查,在您的 ArticleController 中使用 select() 方法创建一个查询,您在其中定义 哪些数据库字段 被发送到 ArticleCollection.

集合将只负责返回给它的那个!

public function index()
{
    return new ArticleCollection(
        Article::latest()->select(['name', 'subtitle', 'cover'])->paginate(10)
    );
}

结果查询

select
  `name`,
  `subtitle`,
  `cover`
from
  `articles`
order by
  `created_at` desc
limit
  10 offset 0

文章集

此文件可以设置为默认文件,这允许您动态设置从 ArticleController 上的 select() 方法传递的值。

class ArticleCollection extends ResourceCollection
{
    public function toArray($request)
    {
        return parent::toArray($request);
    }
}