user(); /** @var \Illuminate\Contracts\Pagination\Paginator */ $paginator = Message::filter($request->input(), MessageFilter::class) ->ofEmployee($user) ->withCount([ 'readingLogs' => fn ($query) => $query->where('employee_id', $user->id), ]) ->latest('id') ->paginate($request->query('per_page', 20)); $list = collect($paginator->items())->map(function (Message $message) { return array_merge( MessageResource::make($message)->resolve(), ['is_read' => $message->reading_logs_count], ); }); // 分页 return [ 'data' => $list, 'meta' => [ 'total' => $paginator->total(), ], ]; } public function show($id, Request $request): MessageResource { /** @var \App\Models\Employee */ $user = $request->user(); $message = Message::ofEmployee($user)->findOrFail($id); $message->readingLogs()->firstOrCreate([ 'employee_id' => $user->id, ]); return MessageResource::make($message); } public function readAll(Request $request) { /** @var \App\Models\Employee */ $user = $request->user(); $messages = Message::ofEmployee($user) ->whereDoesntHave('readingLogs', fn ($query) => $query->where('employee_id', $user->id)) ->get(); try { $datetime = date('Y-m-d H:i:s'); MessageReadingLog::insert( $messages->map(fn (Message $message) => [ 'message_id' => $message->id, 'employee_id' => $user->id, 'created_at' => $datetime, 'updated_at' => $datetime, ])->all() ); } catch (Throwable $e) { report($e); } return response()->noContent(); } }