api de gestion de ticket, basé sur php-crud-api. Le but est de décorrélé les outils de gestion des données, afin
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

ColumnsBuilder.php 3.9KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. <?php
  2. namespace Tqdev\PhpCrudApi\Database;
  3. use Tqdev\PhpCrudApi\Column\Reflection\ReflectedColumn;
  4. use Tqdev\PhpCrudApi\Column\Reflection\ReflectedTable;
  5. class ColumnsBuilder
  6. {
  7. private $driver;
  8. private $converter;
  9. public function __construct(string $driver)
  10. {
  11. $this->driver = $driver;
  12. $this->converter = new ColumnConverter($driver);
  13. }
  14. public function getOffsetLimit(int $offset, int $limit): string
  15. {
  16. if ($limit < 0 || $offset < 0) {
  17. return '';
  18. }
  19. switch ($this->driver) {
  20. case 'mysql':return " LIMIT $offset, $limit";
  21. case 'pgsql':return " LIMIT $limit OFFSET $offset";
  22. case 'sqlsrv':return " OFFSET $offset ROWS FETCH NEXT $limit ROWS ONLY";
  23. }
  24. }
  25. private function quoteColumnName(ReflectedColumn $column): string
  26. {
  27. return '"' . $column->getName() . '"';
  28. }
  29. public function getOrderBy(ReflectedTable $table, array $columnOrdering): string
  30. {
  31. if (count($columnOrdering) == 0) {
  32. return '';
  33. }
  34. $results = array();
  35. foreach ($columnOrdering as $i => list($columnName, $ordering)) {
  36. $column = $table->getColumn($columnName);
  37. $quotedColumnName = $this->quoteColumnName($column);
  38. $results[] = $quotedColumnName . ' ' . $ordering;
  39. }
  40. return ' ORDER BY ' . implode(',', $results);
  41. }
  42. public function getSelect(ReflectedTable $table, array $columnNames): string
  43. {
  44. $results = array();
  45. foreach ($columnNames as $columnName) {
  46. $column = $table->getColumn($columnName);
  47. $quotedColumnName = $this->quoteColumnName($column);
  48. $quotedColumnName = $this->converter->convertColumnName($column, $quotedColumnName);
  49. $results[] = $quotedColumnName;
  50. }
  51. return implode(',', $results);
  52. }
  53. public function getInsert(ReflectedTable $table, array $columnValues): string
  54. {
  55. $columns = array();
  56. $values = array();
  57. foreach ($columnValues as $columnName => $columnValue) {
  58. $column = $table->getColumn($columnName);
  59. $quotedColumnName = $this->quoteColumnName($column);
  60. $columns[] = $quotedColumnName;
  61. $columnValue = $this->converter->convertColumnValue($column);
  62. $values[] = $columnValue;
  63. }
  64. $columnsSql = '(' . implode(',', $columns) . ')';
  65. $valuesSql = '(' . implode(',', $values) . ')';
  66. $outputColumn = $this->quoteColumnName($table->getPk());
  67. switch ($this->driver) {
  68. case 'mysql':return "$columnsSql VALUES $valuesSql";
  69. case 'pgsql':return "$columnsSql VALUES $valuesSql RETURNING $outputColumn";
  70. case 'sqlsrv':return "$columnsSql OUTPUT INSERTED.$outputColumn VALUES $valuesSql";
  71. }
  72. }
  73. public function getUpdate(ReflectedTable $table, array $columnValues): string
  74. {
  75. $results = array();
  76. foreach ($columnValues as $columnName => $columnValue) {
  77. $column = $table->getColumn($columnName);
  78. $quotedColumnName = $this->quoteColumnName($column);
  79. $columnValue = $this->converter->convertColumnValue($column);
  80. $results[] = $quotedColumnName . '=' . $columnValue;
  81. }
  82. return implode(',', $results);
  83. }
  84. public function getIncrement(ReflectedTable $table, array $columnValues): string
  85. {
  86. $results = array();
  87. foreach ($columnValues as $columnName => $columnValue) {
  88. if (!is_numeric($columnValue)) {
  89. continue;
  90. }
  91. $column = $table->getColumn($columnName);
  92. $quotedColumnName = $this->quoteColumnName($column);
  93. $columnValue = $this->converter->convertColumnValue($column);
  94. $results[] = $quotedColumnName . '=' . $quotedColumnName . '+' . $columnValue;
  95. }
  96. return implode(',', $results);
  97. }
  98. }