需要往Resource传两个时间进行统计一些数据,单个resource可以,但是遇到collection怎么处理呢

UserResource.php

<?php

namespace App\Http\Resources;

use Illuminate\Http\Request;
use Illuminate\Http\Resources\Json\JsonResource;
use App\Models\Order;
use Carbon\Carbon;
use App\Models\ExceptionTrack;

class UserResource extends JsonResource
{
    /**
     * Transform the resource into an array.
     *
     * @return array<string, mixed>
     */
    public function toArray(Request $request): array
    {
        ExceptionTrack::create([
            'title' => $this->begin_at
        ]);
        $begin_at = Carbon::parse($this->begin_at);
        $end_at = Carbon::parse($this->end_at);
        $self_orders_count = Order::whereBetween('created_at', [$begin_at->startOfDay(), $end_at->endOfDay()])->where('user_id', $this->id)->count();
        $children_orders_count = Order::whereBetween('created_at', [$begin_at->startOfDay(), $end_at->endOfDay()])->where('parent_id', $this->id)->count();
        $total_orders_count = $self_orders_count + $children_orders_count;
        $pending_orders_count = Order::whereBetween('created_at', [$begin_at->startOfDay(), $end_at->endOfDay()])->where('user_id', $this->id)->where('status', 'pending')->count();
        $enable_orders_count = Order::whereBetween('created_at', [$begin_at->startOfDay(), $end_at->endOfDay()])->where('user_id', $this->id)->where('status', 'enable')->count();
        $disable_orders_count = Order::whereBetween('created_at', [$begin_at->startOfDay(), $end_at->endOfDay()])->where('user_id', $this->id)->where('status', 'disable')->count();
        return [
            'id' => $this->id,
            'nickname' => $this->nickname,
            'name' => $this->name,
            'phone' => $this->phone,
            'avatar' => $this->avatar,
            'user_qrcode_url' => env('APP_URL').'/uploads/qrcodes/'.auth('sanctum')->user()->id.'_wx_qrcode.jpg',
            'total_orders_count' => $total_orders_count,
            'self_orders_count' => $self_orders_count,
            'children_orders_count' => $children_orders_count,
            'pending_orders_count' => $pending_orders_count,
            'enable_orders_count' => $enable_orders_count,
            'disable_orders_count' => $disable_orders_count
        ];
    }

    public static function collection($resource){
        return new UserResourceCollection($resource);
    }
}

Controller.php


        $resource = new UserResource($request->user());
        if ($request->has('begin_at') && $request->has('end_at')) {
            $resource->begin_at = $request->begin_at;
            $resource->end_at = $request->end_at;
        }
        return api_response($resource);

以上是单个resource的情况,可以正常运行。
如果是返回集合collection的时候应该怎么处理呢?

《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
讨论数量: 3
Tomo11111

返回资源集合时候可以使用 additional 方法携带元数据
添加元数据

return (new UserCollection(User::all()->load('roles')))
                ->additional(['meta' => [
                    'key' => 'value',
                ]]);
2周前 评论

Resources 本身是方便你组装数据,你这懒省事儿查询都写单个 Resource 里,那 Collection 就费点事儿再写一个喽。

2周前 评论
sanders

妈呀,在 Resource 里面不要做查询,否则一个 collection 加载 N+1问题就会爆发。如果是统计数据展示,你不如专门为统计结果做个 Resource 将查询好的数据填进去, Resource 与模型之间没有那么强的耦合,反倒是与请求和响应之间的关系更多一些。

2周前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!