query('keyword')) { $query->where('name', 'like', "%{$kw}%"); } if ($request->filled('status')) { $query->where('status', (int) $request->query('status')); } $paginator = $query ->orderBy('sort') ->orderBy('id') ->paginate((int) $request->query('page_size', 20)) ->withQueryString(); $paginator->getCollection()->transform(fn (ResearchDirection $r) => $this->serialize($r)); return $this->paginated($paginator); } public function options(): JsonResponse { $items = ResearchDirection::query() ->where('status', 1) ->orderBy('sort') ->orderBy('name') ->get() ->map(fn (ResearchDirection $r) => $this->serialize($r)); return $this->ok(['items' => $items]); } public function store(Request $request): JsonResponse { $data = $request->validate([ 'name' => ['required', 'string', 'max:255', 'unique:research_directions,name'], 'sort' => ['nullable', 'integer', 'min:0'], 'status' => ['required', 'integer', 'in:0,1'], 'remark' => ['nullable', 'string', 'max:512'], ]); $row = ResearchDirection::query()->create([ 'name' => trim($data['name']), 'sort' => (int) ($data['sort'] ?? 0), 'status' => (int) $data['status'], 'remark' => $data['remark'] ?? null, ]); return $this->ok($this->serialize($row), '已创建'); } public function update(Request $request, int $researchDirection): JsonResponse { $row = ResearchDirection::query()->findOrFail($researchDirection); $data = $request->validate([ 'name' => ['sometimes', 'string', 'max:255', 'unique:research_directions,name,'.$row->id], 'sort' => ['nullable', 'integer', 'min:0'], 'status' => ['sometimes', 'integer', 'in:0,1'], 'remark' => ['nullable', 'string', 'max:512'], ]); if (isset($data['name'])) { $data['name'] = trim($data['name']); } $row->fill($data); $row->save(); return $this->ok($this->serialize($row->fresh()), '已保存'); } public function destroy(int $researchDirection): JsonResponse { $row = ResearchDirection::query()->findOrFail($researchDirection); if ($row->adminUsers()->exists()) { return $this->fail('该研究方向已分配给网格员,无法删除', 422); } $row->delete(); return $this->ok(null, '已删除'); } /** * @return array */ protected function serialize(ResearchDirection $r): array { $teacherCount = $r->teachers()->count(); return [ 'id' => $r->id, 'name' => $r->name, 'sort' => (int) $r->sort, 'status' => (int) $r->status, 'remark' => $r->remark, 'teacher_count' => $teacherCount, 'created_at' => $r->created_at?->toIso8601String(), ]; } }