projections = $projections; } public function add(Projection $projection): self { $newProjections = [...$this->projections, $projection]; return new self(...$newProjections); } public function toSql(): string { if (empty($this->projections)) { return '*'; } return implode(', ', array_map(fn ($p) => $p->toSql(), $this->projections)); } public function getAliases(): array { $aliases = []; foreach ($this->projections as $projection) { $aliases = array_merge($aliases, $projection->getAliases()); } return $aliases; } }