首页 > 解决方案 > Laravel 更改集合中的每个模型

问题描述

我有一个项目集合。现在,在通过我的 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();

标签: phplaraveleloquent

解决方案


您可以通过多种方式实现这一目标。

每个Eloquent 集合都扩展了Collection类,让您可以使用有用的方法,例如map()or each()

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

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

return $trainees;

PS:默认情况下,当向 API 返回数组/集合时,Laravel 会将其返回为 JSON。


第二种方法,我认为更细化和推荐,是使用API Resources。从文档中:

在构建 API 时,您可能需要一个位于 Eloquent 模型和实际返回给应用程序用户的 JSON 响应之间的转换层。Laravel 的资源类允许你将你的模型和模型集合转换成 JSON。

因此,您需要:

1. 生成你的 API 资源

php artisan make:resource TraineeResource

2.自定义它

应用\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.应用它

在您的控制器中:

应用程序/Http/Controllers/MyCoolController.php

use App\Http\Resources\TraineeResource;

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

    // return it
    return TraineeResource::collection($trainees);
}

推荐阅读