如何自定义拉拉维尔的集合 API 资源?



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

ArticleController.php:

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

Article Collection.php:

<?php
namespace AppHttpResources;
use IlluminateHttpResourcesJsonResourceCollection;
class ArticleCollection extends ResourceCollection
{
/**
* Transform the resource collection into an array.
*
* @param  IlluminateHttpRequest  $request
* @return array|IlluminateContractsSupportArrayable|JsonSerializable
*/
public function toArray($request)
{
return [
'name' => $this->title,
'subtitle' => $this->subtitle,
'cover' => $this->cover,
];
}
}

这种转换模型的方法似乎适用于单个模型,但不适用于集合。使用集合API资源时,应如何自定义将返回的字段?

让您的DB查询定义最终字段

通过这种方式,在ArticleController中使用select()方法创建一个查询,在该方法中定义哪些DB字段发送到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

Article Collection

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

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

您可以这样使用它:

return new ArticleCollection($articales); 

最新更新