Laravel更改分页数据

The*_*eal 15 laravel

我的Laravel分页输出就像以前的laravel分页一样,但我需要为每个对象更改数据数组.我的输出是:

产量

如您所见,数据对象有2个项目,我需要更改.

我的代码是:

$items = $this->items()
        ->where('position', '=', null)
        ->paginate(15);
Run Code Online (Sandbox Code Playgroud)

这返回带有数据透视表的用户项,但我不喜欢数据透视表在JSON中显示的方式,因此我决定更改项目并使用项目前的数据透视来组织每个项目.

为此,我试图使用 foreach

foreach ($items->data as $item)
        {

        }
Run Code Online (Sandbox Code Playgroud)

由于我不知道的原因,我给出了一个错误:

Undefined property: Illuminate\Pagination\LengthAwarePaginator::$data"
status_code: 500
Run Code Online (Sandbox Code Playgroud)

有帮助吗?

Mur*_*rwa 63

paginator的项目是一个集合.你可以抓住它并转换数据,如下所示:

$paginator = $this->items()->where('position', '=', null)->paginate(15);
$paginator->getCollection()->transform(function ($value) {
    // Your code here
    return $value;
});
Run Code Online (Sandbox Code Playgroud)

  • 您以这种方式丢失分页数据 (4认同)
  • 多谢兄弟!并且不要忘记在底部返回修改后的数据。 (2认同)

Sco*_*eld 25

有一种setCollection方法可以达到这种目的。

$items = Model::paginate(10);

$updatedItems = $items->getCollection();

// data manipulation
// ...

$items->setCollection($updateItems);
Run Code Online (Sandbox Code Playgroud)

从源代码 /Illuminate/Pagination/AbstractPaginator.php

/**
* Set the paginator's underlying collection.
*
* @param  \Illuminate\Support\Collection  $collection
* @return $this
*/
public function setCollection(Collection $collection)
{
    $this->items = $collection;

    return $this;
}
Run Code Online (Sandbox Code Playgroud)

来源

  • @user3803848是的,您只想根据当前分页数据更新这些数据的集合。为什么要更改total和lastPage? (4认同)

小智 16

如果您想保留分页的项目:

    $itemsPaginated = $this->items()
         ->paginate(15);

    $itemsTransformed = $itemsPaginated
        ->getCollection()
        ->map(function($item) {
            return [
                'id' => $item->id,
            ];
    })->toArray();

    $itemsTransformedAndPaginated = new \Illuminate\Pagination\LengthAwarePaginator(
        $itemsTransformed,
        $itemsPaginated->total(),
        $itemsPaginated->perPage(),
        $itemsPaginated->currentPage(), [
            'path' => \Request::url(),
            'query' => [
                'page' => $itemsPaginated->currentPage()
            ]
        ]
    );
Run Code Online (Sandbox Code Playgroud)

  • 非常感谢,我认为这应该是公认的答案。主要是因为分页功能将继续在您的视图中工作,您仍然可以在刀片文件中调用诸如“附加”和“链接”之类的函数。如果您将 Collection 传递给刀片视图,则这些功能将不可用。 (2认同)
  • Laravel 8.9.0 添加了“through”方法,该方法将使项目保持分页。`$itemsPaginated->through(function ($item) { return ['id' => $item->id ]; });` 请参阅我的答案。 (2认同)

小智 7

如果您想更改或更新 Laravel 分页输出但不影响分页,那么您应该遵循这些说明。

$items = Model::paginate(10);

$updatedItems = $items->getCollection();

// data manipulation

// ...

$items->setCollection($updateItems);
Run Code Online (Sandbox Code Playgroud)

你可以从这里检查这个


dra*_*ire 6

Laravel 8.9.0 已将该方法添加throughAbstractPaginator.
它使用回调转换项目切片中的每个项目,并保持项目分页。

$paginator = $this->items()->where('position', '=', null)->paginate(15);
$paginator->through(function ($value) {
    // Your code here
    return $value;
});
Run Code Online (Sandbox Code Playgroud)

源代码:

/**
 * Transform each item in the slice of items using a callback.
 *
 * @param  callable  $callback
 * @return $this
 */
public function through(callable $callback)
{
    $this->items->transform($callback);

    return $this;
}
Run Code Online (Sandbox Code Playgroud)


Vee*_*rra -11

您必须在刀片中使用以下代码

{!! $items->render() !!}
Run Code Online (Sandbox Code Playgroud)