繁体   English   中英

如何格式化(转换)laravel 数据库分页结果?

[英]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”方法,但这会影响所有应用程序部分(不仅是控制器中的索引操作)。

您可以在Laravel执行相同的Laravel ,例如:

return Model::select(['id', 'some_field', ...// more some fields])
->with('data')
->paginate(20)
->map(function($item, $key) {
    // Some pseudo code
    $item->uid = uniqid();

    // Must return the $item
    return $item;
});

还有其他方式可以做类似的事情。 您可以在Laravel中做更多的事情 在许多方法中也有一种转换方法。

这是我只修改项目而不丢失分页数据的解决方案

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM