database->first( 'SELECT COUNT(*) AS n FROM territories WHERE name LIKE :s OR description LIKE :s', ['s' => '%' . $search . '%'] ); } else { $row = $this->database->first('SELECT COUNT(*) AS n FROM territories'); } return (int) ($row['n'] ?? 0); } /** @return list> */ public function findPaged(int $page, int $perPage, string $search = ''): array { $offset = ($page - 1) * $perPage; if ($search !== '') { return $this->database->query( 'SELECT * FROM territories WHERE name LIKE :s OR description LIKE :s ORDER BY name ASC LIMIT :limit OFFSET :offset', ['s' => '%' . $search . '%', 'limit' => $perPage, 'offset' => $offset] ); } return $this->database->query( 'SELECT * FROM territories ORDER BY name ASC LIMIT :limit OFFSET :offset', ['limit' => $perPage, 'offset' => $offset] ); } /** @return list> */ public function allOrdered(): array { return $this->database->query('SELECT * FROM territories ORDER BY name ASC'); } public function householdCount(int|string $territoryId): int { $row = $this->database->first( 'SELECT COUNT(*) AS n FROM households WHERE territory_id = :id', ['id' => $territoryId] ); return (int) ($row['n'] ?? 0); } /** @return list> */ public function householdCountsKeyed(): array { $rows = $this->database->query( 'SELECT territory_id, COUNT(*) AS n FROM households GROUP BY territory_id' ); $counts = []; foreach ($rows as $row) { $counts[(int) $row['territory_id']] = (int) $row['n']; } return $counts; } /** @return list */ public function distinctStreets(int|string $territoryId): array { $rows = $this->database->query( 'SELECT DISTINCT street_name FROM households WHERE territory_id = :id AND street_name IS NOT NULL AND street_name != \'\' ORDER BY street_name ASC', ['id' => $territoryId] ); return array_column($rows, 'street_name'); } }