В целом подход правильный.
Именно с точки зрения SOLID и сам класс, и его использование спроектированы верно.
Можно поправить только по мелочам.
- код соединения никуда не годится. Брать отсюда:
Как правильно соединяться с mysql в PDO
- при этом конфиграцию (хост, пароль, чарсет и прочее) вынести отдельно и передавать в конструктор в виде массива
- query() переписать так:
private function query($query, array $params = array()){
$stmt = $this->db->prepare($query);
$stmt->execute($params);
return $stmt;
}
- добавить getRow() и использовать в getById именно его.
- getRows переименовать в getAll чтобы не было путаницы и переписать так
public function getRows($query, array $params = array(), $mode= PDO::FETCH_ASSOC){
return $this->query($query, $params)->fetchAll($mode);
}
- либо добавить методы для всех методов PDO, либо сделать $db публичной. потому что когда тебе нужно будет выполнить десяток инсертов обернутых в транзакцию, эта обертка превратится в тыкву.