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

chhkpiq4  于 2023-06-25  发布在  其他
关注(0)|答案(6)|浏览(127)

例如,我有以下代码:

public function index()
{
    return
        Model::select(['id', 'some_field', ...// more some fields])
            ->with('data') // load relation
            ->paginate(20);
}

如何格式化(转换/操作)从数据库中获得的数据?
CakePHP ORM对此有有用的方法-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中做同样的事情。我可以覆盖模型中的“toArray”方法,但这将影响所有应用程序部分(不仅仅是控制器中的索引操作)。

nsc4cvqm

nsc4cvqm1#

你可以在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中做更多的事情。在众多方法中,也有一种变换方法。

js4nwp54

js4nwp542#

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

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

uhry853o3#

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

j0pj023g4#

已经提供的大多数答案都可以工作,但将返回一个集合,而不是一个分页的资源。技巧是在map 'ping之前使用tap辅助方法,以返回您修改的相同对象。

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

jaql4c8m5#

我不确定是否还有人需要这个。但我找到了另一个解决办法。这不是最好的解决方案,但它完成了工作。
同时支持transform()和map()函数。这里是链接:https://jnbrnplbr.medium.com/transform-map-laravel-paginated-collection-b1ab912d7996

jm81lzqq

jm81lzqq6#

maptransform将不起作用。你应该使用through,它在laravel官方API中指定的AbstractPaginator中支持。
例如:

User::filter($request->all()
   ->with('applications')
   ->paginate(config('app.defaults.pageSize'))
   // through() will call transform() on the $items in the pagination object
   ->through(function ($user, $key) {
      $user['picture'] = $user->avatar;

      return $user;
   });

参考:https://stackoverflow.com/a/65560742/11297747

相关问题