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)
{
}