123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106 |
- <?php
- namespace Tqdev\PhpCrudApi\Database;
-
- use Tqdev\PhpCrudApi\Column\Reflection\ReflectedColumn;
- use Tqdev\PhpCrudApi\Column\Reflection\ReflectedTable;
-
- class ColumnsBuilder
- {
- private $driver;
- private $converter;
-
- public function __construct(String $driver)
- {
- $this->driver = $driver;
- $this->converter = new ColumnConverter($driver);
- }
-
- public function getOffsetLimit(int $offset, int $limit): String
- {
- if ($limit < 0 || $offset < 0) {
- return '';
- }
- switch ($this->driver) {
- case 'mysql':return "LIMIT $offset, $limit";
- case 'pgsql':return "LIMIT $limit OFFSET $offset";
- case 'sqlsrv':return "OFFSET $offset ROWS FETCH NEXT $limit ROWS ONLY";
- }
- }
-
- private function quoteColumnName(ReflectedColumn $column): String
- {
- return '"' . $column->getName() . '"';
- }
-
- public function getOrderBy(ReflectedTable $table, array $columnOrdering): String
- {
- $results = array();
- foreach ($columnOrdering as $i => list($columnName, $ordering)) {
- $column = $table->get($columnName);
- $quotedColumnName = $this->quoteColumnName($column);
- $results[] = $quotedColumnName . ' ' . $ordering;
- }
- return implode(',', $results);
- }
-
- public function getSelect(ReflectedTable $table, array $columnNames): String
- {
- $results = array();
- foreach ($columnNames as $columnName) {
- $column = $table->get($columnName);
- $quotedColumnName = $this->quoteColumnName($column);
- $quotedColumnName = $this->converter->convertColumnName($column, $quotedColumnName);
- $results[] = $quotedColumnName;
- }
- return implode(',', $results);
- }
-
- public function getInsert(ReflectedTable $table, array $columnValues): String
- {
- $columns = array();
- $values = array();
- foreach ($columnValues as $columnName => $columnValue) {
- $column = $table->get($columnName);
- $quotedColumnName = $this->quoteColumnName($column);
- $columns[] = $quotedColumnName;
- $columnValue = $this->converter->convertColumnValue($column);
- $values[] = $columnValue;
- }
- $columnsSql = '(' . implode(',', $columns) . ')';
- $valuesSql = '(' . implode(',', $values) . ')';
- $outputColumn = $this->quoteColumnName($table->getPk());
- switch ($this->driver) {
- case 'mysql':return "$columnsSql VALUES $valuesSql";
- case 'pgsql':return "$columnsSql VALUES $valuesSql RETURNING $outputColumn";
- case 'sqlsrv':return "$columnsSql OUTPUT INSERTED.$outputColumn VALUES $valuesSql";
- }
- }
-
- public function getUpdate(ReflectedTable $table, array $columnValues): String
- {
- $results = array();
- foreach ($columnValues as $columnName => $columnValue) {
- $column = $table->get($columnName);
- $quotedColumnName = $this->quoteColumnName($column);
- $columnValue = $this->converter->convertColumnValue($column);
- $results[] = $quotedColumnName . '=' . $columnValue;
- }
- return implode(',', $results);
- }
-
- public function getIncrement(ReflectedTable $table, array $columnValues): String
- {
- $results = array();
- foreach ($columnValues as $columnName => $columnValue) {
- if (!is_numeric($columnValue)) {
- continue;
- }
- $column = $table->get($columnName);
- $quotedColumnName = $this->quoteColumnName($column);
- $columnValue = $this->converter->convertColumnValue($column);
- $results[] = $quotedColumnName . '=' . $quotedColumnName . '+' . $columnValue;
- }
- return implode(',', $results);
- }
-
- }
|