需要往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的时候应该怎么处理呢?
返回资源集合时候可以使用 additional 方法携带元数据
添加元数据
Resources 本身是方便你组装数据,你这懒省事儿查询都写单个 Resource 里,那 Collection 就费点事儿再写一个喽。
妈呀,在
Resource
里面不要做查询,否则一个collection
加载 N+1问题就会爆发。如果是统计数据展示,你不如专门为统计结果做个Resource
将查询好的数据填进去,Resource
与模型之间没有那么强的耦合,反倒是与请求和响应之间的关系更多一些。