Laravel меняет каждую модель в коллекции - PullRequest
0 голосов
/ 14 ноября 2018

У меня есть коллекция предметов.Теперь, прежде чем отправить его через мой API, я хочу изменить значение модели (но я не хочу обновлять свою модель в базе данных).

Теперь я хочу выполнить цикл по моей коллекциии вернуть его как json, но я получаю invalid Payload.

Вот код, который я выполняю:

$trainees = Trainee::select();
        if(!$request->user()->hasPermission('read-trainees')) {
            $trainees->where('status', 1)->where('visible', 1);
        } else {
            $trainees->with(array('user'=>function($query){
                $query->select('id','firstname', 'lastname');
            }));
            $trainees->select('user_id');
        }
        $trainees->select('interested_jobs', 'graduation');
        $trainees = $trainees->get();
        return $trainees
            ->map(function ($item) {
                $item->id = encrypt($item->id);
                return $item;
            })
            ->toJson();

Ответы [ 2 ]

0 голосов
/ 14 ноября 2018

Вы можете достичь этого несколькими способами.

Каждая Eloquent коллекция расширяет класс Collection , что позволяет использовать такой полезный метод, как Map():

// get your collection
$trainees = Trainee::all();

// customize them
$trainees->each(function ($trainee) {
  $trainee->id = encrypt($item->id);
});

return $trainees;

PS: по умолчанию при возврате массива / коллекции в API Laravel возвращает его как JSON.


Второй подход, более детальный и рекомендуемый, на мой взгляд, заключается в использовании Ресурсы API . Из документации:

При создании API вам может понадобиться слой преобразования, который находится между вашими моделями Eloquent и ответами JSON, которые на самом деле вернулся к пользователям вашего приложения. Классы ресурсов Laravel позволяют Вы выразительно и легко трансформируете свои модели и модели коллекции в JSON.

Итак, вам нужно:

1. Создайте свой ресурс API

php artisan make:resource TraineeResource

2. Настройте его

App \ Http \ Resources \ TraineeResource.php

<?php

namespace App\Http\Resources;

use Illuminate\Http\Resources\Json\JsonResource;

class TraineeResource extends JsonResource
{
    /**
     * Transform the resource into an array.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return array
     */
    public function toArray($request)
    {
        return [
            'id' => encrypt($this->id),
            // ...
        ];
    }
}

3. Примените это

В вашем контроллере:

App / Http / Контроллеры / MyCoolController.php

use App\Http\Resources\TraineeResource

public function aCoolMethod(Request $request)
{
    // get your collection
    $trainees = Trainee::all();

    // return it
    return TraineeResource::collection($trainees);
}
0 голосов
/ 14 ноября 2018

Вы можете использовать функцию map, чтобы изменить данные для каждого элемента в коллекции .

return $trainees
    ->map(function ($item) {
        $item->id = decrypt($item->id);
        return $item;
    })
    ->toJson();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...