laravel 访问resource::collection内的其他参数

4zcjmb1e  于 2023-02-25  发布在  其他
关注(0)|答案(1)|浏览(302)

我有返回用户测验状态的资源,如下所示

$users = Users::with('UserQuiz')->get();
return response(['users'=> UserResource::collection($users ) ]);

在资源里面我需要返回用户信息和他们的测验

$passedQuizzes = [] ;
foreach($this->UserQuiz as $userQuiz )
{
   if($userQuiz->score > 50 )
      $passedQuizzes[] = $userQuiz  ; 
}

$totalQuiz = Quiz::count();

return [

  'id' => $this->id , 
  'name' => $this->name , 
  'email' => $this->email , 
  
  'quiz'=>[
      'total'=> $totalQuiz , 
      'passed' => count($passedQuizzes)
  ]
  
];

我需要显示测验的总数和多少这个用户已经通过...所以我需要一个额外的查询内我的资源这是不是一个好主意考虑到我运行相同的查询一遍又一遍
因此,我需要以某种方式将totalQuiz从控制器注入到资源中,因此,我在文档中提到了其他内容,因此我猜它应该类似于

$users = Users::with('UserQuiz')->get();
$totalQuiz = Quiz::count();

return response(['users'=> UserResource::collection($users )->additional(['totalQuiz' => $totalQuiz ]) ]);

但是我不知道如何访问资源中的这些附加数据,我希望能够执行以下操作

return [

  'id' => $this->id , 
  'name' => $this->name , 
  'email' => $this->email , 
  
  'quiz'=>[
      'total'=> $this->additional->totalQuiz , 
      'passed' => count($passedQuizzes)
  ]
  
];

这是一个非常常见的问题,我想知道为什么网上没有很多关于这个问题的答案
这是我唯一能在网上找到的似乎没有合适答案的东西
Additional data in Laravel Resource

vohkndzv

vohkndzv1#

下面的代码向你的资源添加了一个静态方法。这个方法可以根据你的需要添加任意多的参数。我添加$totalQuiz参数是为了演示的目的。

//add static variable
   public static $totalQuiz;

   /**
     * Create a new anonymous resource collection.
     *
     * @param  mixed  $resource
     * @return \Illuminate\Http\Resources\Json\AnonymousResourceCollection
     */
    public static function customCollection($resource, $totalQuiz)
    {
        self::$totalQuiz = $totalQuiz;

        return tap(new AnonymousResourceCollection($resource, static::class), function ($collection) {
            if (property_exists(static::class, 'preserveKeys')) {
                $collection->preserveKeys = (new static([]))->preserveKeys === true;
            }
        });
    }

然后,您可以使用这个新的静态方法(而不是静态UserResource::collection($users)方法)创建资源。

UserResource::customCollection($users, $totalQuiz);

相关问题