[英]How to format (transform) laravel database paginated results?
例如我有以下代码:
public function index()
{
return
Model::select(['id', 'some_field', ...// more some fields])
->with('data') // load relation
->paginate(20);
}
我如何格式化(转换/操作)从数据库中获取的数据?
CakePHP ORM have useful method for this - https://book.cakephp.org/3.0/en/orm/query-builder.html#adding-calculated-fields && https://book.cakephp.org/3.0/en/ orm/retrieving-data-and-resultsets.html#map-reduce
但我找不到任何可以帮助我在 Laravel 中做同样事情的东西。 我可以覆盖 model 中的“toArray”方法,但这会影响所有应用程序部分(不仅是控制器中的索引操作)。
这是我只修改项目而不丢失分页数据的解决方案
public function index()
{
$data_with_pagination = Model::select(['id', 'some_field', ...// more some fields])
->with('data') // load relation
->paginate(20);
foreach ($data_with_pagination->items() as $item) {
// modify your item here
$item['uid'] = uniqid();
}
return $data_with_pagination;
}
paginate()
和get()
将返回一个Collection
使您可以访问所有Collection
方法 。
您将可以执行以下操作:
public function index()
{
return
Model::select(['id', 'some_field', ...// more some fields])
->with('data') // load relation
->paginate(20)
->map(function($model) {
$model->total_things = $model->one_thing + $model->other_thing;
return $model;
});
}
已经提供的大多数答案都可以使用,但会返回一个集合而不是分页资源。 诀窍是在map
'ping 之前使用tap
helper 方法,返回您修改的相同 object。
public function index()
{
return tap(Model::select(['id', 'some_field', ...// more some fields])
->with('data') // load relation
->paginate(20))
->map(function ($model) {
$model->something_to_format = someFormattingHelper($model->something_to_format);
return $model;
});
}
我不确定是否还有人需要这个。 但我找到了另一个解决方案。 这不是最好的解决方案,但它可以完成工作。
支持 transform() 和 map() 函数。 这是链接: https://jnbrnplbr.medium.com/transform-map-laravel-paginated-collection-b1ab912d7996
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.