Laravel更改集合中的每个模型

时间:2018-11-14 16:06:10

标签: php laravel eloquent

我有一些物品。现在,在通过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 :(得分:1)

您可以使用map函数来更改collection中每个项目的数据。

return $trainees
    ->map(function ($item) {
        $item->id = decrypt($item->id);
        return $item;
    })
    ->toJson();

答案 1 :(得分:1)

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

每个Eloquent collection都扩展了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 Resources。从文档中:

  

构建API时,您可能需要一个位于   在您的口才模型和实际的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 / 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);
}