Laravel изменяет данные разбивки на страницы

Вывод pagination моей Laravel похож на временную разбивку laravel, но мне нужно изменить массив данных для каждого объекта. Мой выход:

Вывод

Как вы можете видеть, объект данных имеет 2 элемента, которые мне нужно изменить.

Мой код:

$items = $this->items()
        ->where('position', '=', null)
        ->paginate(15);

Что возвращает элементы пользователя с сводной таблицей, но мне не нравится, как показана сводная таблица в JSON, поэтому я решил изменить элементы и организовать каждый элемент с помощью точки опоры перед элементом.

С этой целью я попытался использовать foreach

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

        }

который дает мне ошибку, по какой-то причине я не знаю:

Undefined property: Illuminate\Pagination\LengthAwarePaginator::$data"
status_code: 500

Любая помощь?

Ответ 1

Элементы paginator - это коллекция. Вы можете взять его и преобразовать данные следующим образом:

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

Ответ 2

Если вы хотите, чтобы элементы были разбиты на страницы:

    $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()
            ]
        ]
    );

Ответ 3

-Laravel 5.4

// example update column "photo" 
// from "/path/to/photo.png" 
// to "abc.com/path/to/photo.png"
foreach ($items as $item)
{
    $path = $item->photo;

  // Remove 
  $item->offsetUnset("photo");

  // Set
  $item->offsetSet("photo", url($path));
}

Ответ 4

У меня была та же проблема.
Затем я обнаружил Красноватые мутаторы.

Они позволяют вам изменять свои данные при получении или настройке.

В моем примере я хранил HTML как Markdown, затем, когда вы извлекали его в HTML.
Вы включили в свой вопрос очень мало кода, поэтому я предоставлю свою версию для своего конкретного инцидента. Кроме того, код мутатора помещается в модель, а не в контроллер.

use Illuminate\Mail\Markdown;
use Facades\League\HTMLToMarkdown\HtmlConverter as Markup;

class Post extends Model
{
    protected $fillable = [
        'title', 'body'
    ];

    /**
     * Convert to HTML when displaying on the screen.
     */
    public function getBodyAttribute($value)
    {
        return $this->attributes['body'] = Markdown::parse($value);
    }

    /**
     * Convert to Markdown when storing in the database.
     */
    public function setBodyAttribute($value)
    {
        return $this->attributes['body'] = Markup::convert($value);
    }
}

Имена функций должны соответствовать следующим критериям:

  • Начните с get или set в нижнем регистре.
  • Должен быть ваш столбец базы данных в PascalCase (или StudlyCase, поскольку Laravel ссылается на него, хотя я считаю, что его неправильно назвали. См. здесь fooobar.com/questions/500239/...).
  • Наконец, имя функции должно заканчиваться на Attribute с капиталом A.

Ответ 5

Фактически $items является экземпляром Paginator, который вы можете повторить так:

foreach ($items as $item)
{

}

должен работать.

Ответ 6

вы должны использовать ниже код в своем клиенте

{!! $items->render() !!}

Ответ 7

Не обращайте внимания на нумерацию страниц в laravel и попадите в нормальные данные

foreach ($items as $item)
{

}