select('specializations.name') ->join('specializations', 'specializations.id = doctor_specializations.specialization_id') ->where('doctor_specializations.doctor_id', $doctorId) ->findAll(); return array_values(array_filter(array_map( static fn (array $row) => ! empty($row['name']) ? $row['name'] : null, $rows ))); } public function deleteByDoctorId(int $doctorId): void { $this->where('doctor_id', $doctorId)->delete(); } public function syncDoctorSpecializations(int $doctorId, array $specializationIds, ?int $actorId = null): void { $specializationIds = array_values(array_unique(array_map('intval', $specializationIds))); $existingRows = $this->where('doctor_id', $doctorId)->findAll(); $existingBySpecId = []; foreach ($existingRows as $row) { $existingBySpecId[(int) $row['specialization_id']] = $row; } $existingIds = array_keys($existingBySpecId); $toDelete = array_diff($existingIds, $specializationIds); $toInsert = array_diff($specializationIds, $existingIds); if ($toDelete !== []) { $this->where('doctor_id', $doctorId) ->whereIn('specialization_id', $toDelete) ->delete(); } foreach ($toInsert as $specializationId) { $this->insert([ 'doctor_id' => $doctorId, 'specialization_id' => $specializationId, 'status' => 1, 'created_by' => $actorId, 'updated_by' => $actorId, ]); } } }