diseaseRepository->createQueryBuilder('d') ->orderBy('d.id', 'ASC'); if ($regionId !== null) { $qb->andWhere('d.regionId = :regionId') ->setParameter('regionId', $regionId); } $countQb = $this->diseaseRepository->createQueryBuilder('d') ->select('COUNT(d.id)'); if ($regionId !== null) { $countQb->andWhere('d.regionId = :regionId') ->setParameter('regionId', $regionId); } $total = (int) $countQb->getQuery()->getSingleScalarResult(); $qb->setFirstResult(($page - 1) * $perPage) ->setMaxResults($perPage); $data = $qb->getQuery()->getResult(); return [ 'data' => $data, 'total' => $total, 'page' => $page, 'per_page' => $perPage, ]; } public function getShow(int $id): ?Disease { return $this->diseaseRepository->find($id); } public function create(array $data): Disease { if (!array_key_exists('id', $data) || $data['id'] === null || $data['id'] === '') { throw new \InvalidArgumentException('Поле id обязательно.'); } $disease = new Disease(); $this->updateEntity($disease, $data); $this->em->persist($disease); $this->em->flush(); return $disease; } public function update(Disease $disease, array $data): Disease { unset($data['id']); $this->updateEntity($disease, $data); $this->em->flush(); return $disease; } public function delete(Disease $disease): void { $this->em->remove($disease); $this->em->flush(); } private function updateEntity(Disease $disease, array $data): void { if (array_key_exists('id', $data) && $data['id'] !== null && $data['id'] !== '') { $disease->setId((int) $data['id']); } if (array_key_exists('name', $data)) { $disease->setName($data['name']); } if (array_key_exists('previewPicture', $data) || array_key_exists('preview_picture', $data)) { $disease->setPreviewPicture($data['previewPicture'] ?? $data['preview_picture']); } if (array_key_exists('active', $data)) { $disease->setActive($data['active']); } if (array_key_exists('regionId', $data) || array_key_exists('region_id', $data)) { $v = $data['regionId'] ?? $data['region_id']; $disease->setRegionId($v === null || $v === '' ? null : (int) $v); } if (array_key_exists('alias', $data)) { $disease->setAlias($data['alias']); } if (array_key_exists('anons', $data)) { $disease->setAnons($data['anons']); } if (array_key_exists('updateAt', $data) || array_key_exists('update_at', $data)) { $raw = $data['updateAt'] ?? $data['update_at']; if ($raw === null || $raw === '') { $disease->setUpdateAt(null); } elseif ($raw instanceof \DateTimeInterface) { $disease->setUpdateAt($raw); } elseif (is_string($raw)) { $disease->setUpdateAt(new \DateTimeImmutable($raw)); } } if (array_key_exists('hidePicture', $data) || array_key_exists('hide_picture', $data)) { $disease->setHidePicture($data['hidePicture'] ?? $data['hide_picture']); } if (array_key_exists('readTime', $data) || array_key_exists('read_time', $data)) { $disease->setReadTime($data['readTime'] ?? $data['read_time']); } if (array_key_exists('diseasesName', $data) || array_key_exists('diseases_name', $data)) { $disease->setDiseasesName($data['diseasesName'] ?? $data['diseases_name']); } if (array_key_exists('tagsImportant', $data) || array_key_exists('tags_important', $data)) { $disease->setTagsImportant($data['tagsImportant'] ?? $data['tags_important']); } if (array_key_exists('tags', $data)) { $disease->setTags($data['tags']); } if (array_key_exists('diseasesOtherName', $data) || array_key_exists('diseases_other_name', $data)) { $disease->setDiseasesOtherName($data['diseasesOtherName'] ?? $data['diseases_other_name']); } if (array_key_exists('symptom', $data)) { $disease->setSymptom($data['symptom']); } if (array_key_exists('staff', $data)) { $disease->setStaff($data['staff']); } if (array_key_exists('linkServices', $data) || array_key_exists('link_services', $data)) { $disease->setLinkServices($data['linkServices'] ?? $data['link_services']); } if (array_key_exists('staffList', $data) || array_key_exists('staff_list', $data)) { $disease->setStaffList($data['staffList'] ?? $data['staff_list']); } if (array_key_exists('staffPost', $data) || array_key_exists('staff_post', $data)) { $disease->setStaffPost($data['staffPost'] ?? $data['staff_post']); } if (array_key_exists('staffPostExclude', $data) || array_key_exists('staff_post_exclude', $data)) { $disease->setStaffPostExclude($data['staffPostExclude'] ?? $data['staff_post_exclude']); } if (array_key_exists('linkFaq', $data) || array_key_exists('link_faq', $data)) { $disease->setLinkFaq($data['linkFaq'] ?? $data['link_faq']); } if (array_key_exists('bibliography', $data)) { $disease->setBibliography($data['bibliography']); } if (array_key_exists('staffCheck', $data) || array_key_exists('staff_check', $data)) { $disease->setStaffCheck($data['staffCheck'] ?? $data['staff_check']); } if (array_key_exists('content', $data)) { $disease->setContent($data['content']); } } public function syncFromViewDisease(string $viewName = 'public.view_disease'): int { if (!preg_match('/^[A-Za-z0-9_\.]+$/', $viewName)) { throw new \InvalidArgumentException('Invalid view name'); } $connection = $this->em->getConnection(); $sql = sprintf( 'INSERT INTO disease ( id, name, preview_picture, active, region_id, alias, anons, update_at, hide_picture, read_time, diseases_name, tags_important, tags, diseases_other_name, symptom, staff, link_services, staff_list, staff_post, staff_post_exclude, link_faq, bibliography, staff_check, content ) SELECT id, name, preview_picture, active, region_id, alias, anons, update_at, hide_picture, read_time, diseases_name, tags_important, tags, diseases_other_name, symptom, staff, link_services, staff_list, staff_post, staff_post_exclude, link_faq, bibliography, staff_check, content FROM %s ON CONFLICT (id) DO UPDATE SET name = EXCLUDED.name, preview_picture = EXCLUDED.preview_picture, active = EXCLUDED.active, region_id = EXCLUDED.region_id, alias = EXCLUDED.alias, anons = EXCLUDED.anons, update_at = EXCLUDED.update_at, hide_picture = EXCLUDED.hide_picture, read_time = EXCLUDED.read_time, diseases_name = EXCLUDED.diseases_name, tags_important = EXCLUDED.tags_important, tags = EXCLUDED.tags, diseases_other_name = EXCLUDED.diseases_other_name, symptom = EXCLUDED.symptom, staff = EXCLUDED.staff, link_services = EXCLUDED.link_services, staff_list = EXCLUDED.staff_list, staff_post = EXCLUDED.staff_post, staff_post_exclude = EXCLUDED.staff_post_exclude, link_faq = EXCLUDED.link_faq, bibliography = EXCLUDED.bibliography, staff_check = EXCLUDED.staff_check, content = EXCLUDED.content', $viewName ); return (int) $connection->executeStatement($sql); } }