improve migration class
This commit is contained in:
55
Query.php
55
Query.php
@@ -1,6 +1,7 @@
|
||||
<?php
|
||||
namespace DatabaseHelper;
|
||||
|
||||
use DatabaseHelper\enums\Aggregation;
|
||||
use DatabaseHelper\enums\Join;
|
||||
use DatabaseHelper\enums\Order;
|
||||
use http\Exception\InvalidArgumentException;
|
||||
@@ -12,6 +13,7 @@ class Query
|
||||
|
||||
protected Schema $schema;
|
||||
protected array $columns = ['*'];
|
||||
protected array $aggregations = [];
|
||||
protected array $joins = [];
|
||||
public array $orderBy;
|
||||
|
||||
@@ -36,7 +38,7 @@ class Query
|
||||
return $this;
|
||||
}
|
||||
|
||||
public function join(Schema $other, Join $join): Query {
|
||||
public function join(Join $join, Schema $other): Query {
|
||||
$foreignKey = null;
|
||||
if($this->schema->existsReference($other))
|
||||
$foreignKey = $this->schema->foreignKeys[$other->name];
|
||||
@@ -65,17 +67,20 @@ class Query
|
||||
}
|
||||
|
||||
public function toSql(): string {
|
||||
// Merge any aggregations with the standard columns.
|
||||
$selectColumns = $this->columns;
|
||||
if ($this->hasAggregations())
|
||||
$selectColumns = array_merge($selectColumns, $this->aggregations);
|
||||
|
||||
// Build the SELECT clause.
|
||||
$columns = implode(", ", $this->columns);
|
||||
$columns = implode(", ", $selectColumns);
|
||||
$primaryTable = $this->schema->name;
|
||||
$sqlStatement = "SELECT $columns FROM $primaryTable";
|
||||
|
||||
// Append join clauses, if any.
|
||||
if ($this->isJoined()) {
|
||||
foreach ($this->joins as $join) {
|
||||
if ($this->isJoined())
|
||||
foreach ($this->joins as $join)
|
||||
$sqlStatement .= " " . $join['type']->toString() . " NATURAL JOIN " . $join['table'];
|
||||
}
|
||||
}
|
||||
|
||||
// Append the WHERE clause if conditions exist.
|
||||
if ($this->isConditioned()) {
|
||||
@@ -92,18 +97,46 @@ class Query
|
||||
return esc_sql($sqlStatement);
|
||||
}
|
||||
|
||||
public function query(): array {
|
||||
public function aggregate(string $col, string $alias, Aggregation $func): Query {
|
||||
if ($col != '*')
|
||||
$this->schema->requireColumn($col);
|
||||
$this->aggregations[] = strtoupper($func->toString()) . "($col) AS $alias";
|
||||
return $this;
|
||||
}
|
||||
|
||||
public function hasAggregations(): bool {
|
||||
return !empty($this->aggregations);
|
||||
}
|
||||
|
||||
public function query(): mixed {
|
||||
global $wpdb;
|
||||
$query = $this->toSql();
|
||||
$results = $wpdb->get_results($query, ARRAY_A);
|
||||
return $this->castResults($results);
|
||||
return $this->formatResults($results);
|
||||
}
|
||||
|
||||
protected function castResults(array $results): array {
|
||||
foreach ($results as &$row)
|
||||
protected function formatResults(array $results) {
|
||||
$formatted = [];
|
||||
|
||||
foreach ($results as $row) {
|
||||
// Apply type casting to each column in each row.
|
||||
foreach ($row as $column => &$value)
|
||||
if (isset($this->columnTypes[$column]))
|
||||
$value = $this->columnTypes[$column]->valCast($value);
|
||||
return $results;
|
||||
// Use the primary key for row indexing
|
||||
$primaryKey = $this->schema->primaryKey();
|
||||
$formatted[$row[$primaryKey]] = $row;
|
||||
}
|
||||
|
||||
if (count($formatted) === 1) {
|
||||
// Unpack single row results
|
||||
$row = array_shift($formatted);
|
||||
if (count($row) === 1)
|
||||
// Unpack single column results
|
||||
return array_shift($row);
|
||||
return $row;
|
||||
}
|
||||
|
||||
return $formatted;
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user