proceed further with beans

This commit is contained in:
Jan-Niclas Loosen
2025-02-24 10:54:51 +01:00
parent 024e6e73cb
commit 239b81bf0e
10 changed files with 156 additions and 197 deletions

View File

@@ -1,6 +1,7 @@
<?php
namespace DatabaseHelper;
use DatabaseHelper\beans\OrderBy;
use DatabaseHelper\beans\Schema;
use DatabaseHelper\enums\Aggregation;
use DatabaseHelper\enums\Join;
@@ -12,10 +13,10 @@ class Query
use Conditionable;
protected Schema $schema;
protected array $columns = ['*'];
protected array $aggregations = [];
protected array $cols = ['*'];
protected array $aggregates = [];
protected array $joins = [];
public array $orderBy;
public OrderBy $orderBy;
public function __construct(Schema $table) {
$this->schema = $table;
@@ -23,27 +24,27 @@ class Query
public function select(string ...$cols): Query {
if (!empty($cols))
$this->columns = $cols;
$this->cols = $cols;
foreach ($cols as $col)
$this->schema->requireColumn($col);
if (!isset($this->schema->cols[$col]))
throw new InvalidArgumentException("Column '$col' does not exist");
return $this;
}
public function orderBy(string $col, Order $order): Query {
$this->schema->requireColumn($col);
$this->orderBy = [
'name' => $col,
'order' => $order
];
$this->schema->reqCol($col);
$this->orderBy = new OrderBy;
$this->orderBy->col = $col;
$this->orderBy->order = $order;
return $this;
}
public function join(Join $join, Schema $other): Query {
$foreignKey = null;
if($this->schema->existsReference($other))
$foreignKey = $this->schema->references[$other->name];
$foreignKey = $this->schema->refs[$other->name];
if ($other->existsReference($this->schema))
$foreignKey = $other->references[$this->schema->name];
$foreignKey = $other->refs[$this->schema->name];
if (is_null($foreignKey))
throw new InvalidArgumentException('Joins can only applied to referencing columns.');
@@ -68,9 +69,9 @@ class Query
public function toSql(): string {
// Merge any aggregations with the standard columns.
$selectColumns = $this->columns;
$selectColumns = $this->cols;
if ($this->hasAggregations())
$selectColumns = array_merge($selectColumns, $this->aggregations);
$selectColumns = array_merge($selectColumns, $this->aggregates);
// Build the SELECT clause.
$columns = implode(", ", $selectColumns);
@@ -100,12 +101,12 @@ class Query
public function aggregate(string $col, string $alias, Aggregation $func): Query {
if ($col != '*')
$this->schema->requireColumn($col);
$this->aggregations[] = strtoupper($func->toString()) . "($col) AS $alias";
$this->aggregates[] = strtoupper($func->toString()) . "($col) AS $alias";
return $this;
}
public function hasAggregations(): bool {
return !empty($this->aggregations);
return !empty($this->aggregates);
}
public function query(): mixed {