Laravel 7.0 分页在方法链中不起作用

Laravel 7.0 pagination not working in method chain

这里我在 Laravel Eloquent model (User) 上使用带有分页的方法链接,但是在调用方法 each 后分页停止工作。 这种行为是预期的还是我遗漏了什么。官方文档中提到了这一点。

工作正常

User::paginate(10)
    ->appends(request()->all());

输出

{
    "data": [
      {
        "id": 1,
        "email": "user@email.com",
      },
      {
        "id": 2,
        "email": "two@email.com",
      },
    ],
    "current_page": 1,
    "first_page_url": "//localhost/users?page=1",
    "last_page": 5,
    "last_page_url": "//localhost/users?page=5",
    "next_page_url": "//localhost/users?page=2",
    "path": "//localhost/users",
    "per_page": 10,
    "prev_page_url": null,
    "total": 50
  }

但是当我打电话时问题来了 each() method on it

不工作

User::paginate(10)
    ->appends(request()->all())
    ->each(function ($user) {
        $user['someAttribute'] = 'value';
        return $user;
    })

输出(分页无效)

plain simple result 仅查询记录。 (省略分页信息)

[
  {
    "id": 1,
    "email": "user@email.com",
  },
  {
    "id": 2,
    "email": "two@email.com",
  },
]

我认为您在更改 $items 后无法检索分页属性。您必须手动将更改后的数据转换为 LengthAwarePaginator 对象。

        $users = User::paginate(15);
        
        $alteredUsers = $users->getCollection()
            ->each(function($user) {
                $user['someAttribute'] = 'value';
                return $user;
        });
        
        $newPaginatedUsers = new \Illuminate\Pagination\LengthAwarePaginator(
            $alteredUsers,
            $users->total(),
            $users->perPage(),
            $users->currentPage(),
            [
                'path' => \Request::URL(), // optional
            ]
        )->appends(request()->all());

您可以查看源代码 here 并更好地了解如何构建对象。

创建访问器:

<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;

class User extends Model
{
    public function getSomeAttributeAttribute()
    {
        return 'value';
    }
}

$users = User::paginate(10)->appends(request()->all());

https://laravel.com/docs/8.x/eloquent-mutators#defining-an-accessor

https://laravel.com/docs/8.x/eloquent-serialization#appending-values-to-json