1. "lazy loading" - в конструктор передаем обязательные к заполнению параметры, остальные данные подгружаем из базы по мере вызова методов т.е.
public function getText(): string
{
if ($this->text === null) {
$this->loadData();
}
return $this->text;
}
2. Использовать класс хэлпер, например, нужны breadcrumbs, создаем в хэлпере метод getBreadcrumbs в который передается массив Post объектов, метод извлекает данные из объектов и получает недостающие данные одним запросом сразу для всех постов.