where('status', 1); if ($kw = $request->query('keyword')) { $query->where(function ($q) use ($kw) { $q->where('name', 'like', "%{$kw}%") ->orWhere('city', 'like', "%{$kw}%") ->orWhere('province', 'like', "%{$kw}%") ->orWhere('latitude', 'like', "%{$kw}%") ->orWhere('longitude', 'like', "%{$kw}%"); }); } if ($request->filled('city')) { $query->where('city', 'like', '%'.$request->query('city').'%'); } if ($request->filled('region')) { $region = $request->query('region'); $query->where(function ($q) use ($region) { $q->where('city', 'like', "%{$region}%") ->orWhere('province', 'like', "%{$region}%"); }); } $paginator = $query ->orderBy('name') ->paginate((int) $request->query('page_size', $request->boolean('simple') ? 50 : 20)) ->withQueryString(); $paginator->getCollection()->transform(fn (University $u) => $this->serialize($u)); return $this->paginated($paginator); } public function store(Request $request): JsonResponse { $data = $request->validate([ 'name' => ['required', 'string', 'max:255'], 'province' => ['nullable', 'string', 'max:64'], 'city' => ['nullable', 'string', 'max:64'], 'latitude' => ['nullable', 'numeric', 'between:-90,90'], 'longitude' => ['nullable', 'numeric', 'between:-180,180'], 'address' => ['nullable', 'string', 'max:512'], 'remark' => ['nullable', 'string'], ]); $row = University::query()->create([ 'name' => $data['name'], 'province' => $data['province'] ?? null, 'city' => $data['city'] ?? null, 'latitude' => $data['latitude'] ?? null, 'longitude' => $data['longitude'] ?? null, 'address' => $data['address'] ?? null, 'remark' => $data['remark'] ?? null, 'status' => 1, ]); return $this->ok($this->serialize($row), '已创建'); } public function update(Request $request, int $university): JsonResponse { $row = University::query()->where('status', 1)->findOrFail($university); $data = $request->validate([ 'name' => ['sometimes', 'string', 'max:255'], 'province' => ['nullable', 'string', 'max:64'], 'city' => ['nullable', 'string', 'max:64'], 'latitude' => ['sometimes', 'numeric', 'between:-90,90'], 'longitude' => ['sometimes', 'numeric', 'between:-180,180'], 'address' => ['nullable', 'string', 'max:512'], 'remark' => ['nullable', 'string'], ]); $row->fill($data); $row->save(); return $this->ok($this->serialize($row->fresh()), '已保存'); } public function destroy(int $university): JsonResponse { $row = University::query()->findOrFail($university); if (Teacher::query()->where('university_id', $row->id)->exists()) { return $this->fail('该高校下仍有老师,无法删除', 422); } $row->delete(); return $this->ok(null, '已删除'); } /** * @return array */ protected function serialize(University $u): array { return [ 'id' => $u->id, 'name' => $u->name, 'province' => $u->province, 'city' => $u->city, 'latitude' => $u->latitude !== null ? (float) $u->latitude : null, 'longitude' => $u->longitude !== null ? (float) $u->longitude : null, 'address' => $u->address, 'remark' => $u->remark, ]; } }