Как очистить / уменьшить свойства экземпляра модели, чтобы уменьшить размер json? - PullRequest
1 голос
/ 11 июля 2019

У меня есть процесс, в котором некоторые модели обновляются, и после этого я отправляю обновленный объект в толкатель для отслеживания в реальном времени через панель управления, но у этого объекта есть несколько других объектов в виде отношений, поэтому размер сериализованного объекта превышает предел толкателяразмер сообщения, поэтому мой вопрос: как я могу удалить некоторые свойства связанных объектов?

Я уже пробовал использовать функцию извлечения, но я не знаю, как использовать на ближайших объектах

$vehicleEntry = VehicleEntry::with('vehicle')->find($request->entryId);
// I need just the id and plate of the object
$vehicleEntry->pluck('vehicle.id', 'vehicle.plate');

, но появляется ошибка

{id: 1, транспортное средство: {id: 2, табличка: 'JIS575'}, созданный_at: '2019-07-11' }

Ответы [ 2 ]

1 голос
/ 11 июля 2019

Простой способ сделать это - добавить свойство $hidden в вашу модель и присвоить ей массив строк, являющихся именами свойств, которые вы хотите скрыть из вывода json:

protected $hidden = [
    'hide', 
    'these', 
    'attributes', 
    'from', 
    'json'
];

Когда ваш объект конвертируется в json, он автоматически предотвращает отображение любых атрибутов, перечисленных в массиве $hidden.

См. Документы здесь: https://laravel.com/docs/5.8/eloquent-serialization#hiding-attributes-from-json

1 голос
/ 11 июля 2019

Лично я предпочитаю использовать ресурсы API . Таким образом, вы всегда имеете полный контроль над возвращаемыми данными.

Пример:

<?php

namespace App\Http\Resources;

use Illuminate\Http\Resources\Json\Resource;

class VehicleEntryResource extends Resource
{
    /**
     * Transform the resource into an array.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return array
     */
    public function toArray($request)
    {
        return [
            'id' => (int) $this->resource->id,
            // Watch out with this. Make sure the vehicle relation is loaded.
            // Otherwise it will always add this execute another query for
            // every vehicle entry you send to this class, would be bad when
            // you want to send multiple. You could also use
            // $this->whenLoaded('vehicle'), however this needs another
            // resource.
            'vehicle' => [
                'id' => (int) $this->resource->vehicle->id,
                'plate' => $this->resource->vehicle->plate,
            ],
            'created_at' => $this->resource->created_at,
        ];
    }
}

Теперь вы можете называть это где угодно:

new VehicleEntryResource($vehicleEntry);

Не уверен, что сообщения Pusher работают так же хорошо, как JsonResponse, который вы обычно возвращали бы в вашем контроллере. При возврате в ответ он автоматически конвертирует их в массивы. Но вы также можете сделать следующее, чтобы получить представление массива:

(new VehicleEntryResource($vehicleEntry))->toArray(null);
...