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.8KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  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. $results = array();
  32. foreach ($columnOrdering as $i => list($columnName, $ordering)) {
  33. $column = $table->get($columnName);
  34. $quotedColumnName = $this->quoteColumnName($column);
  35. $results[] = $quotedColumnName . ' ' . $ordering;
  36. }
  37. return implode(',', $results);
  38. }
  39. public function getSelect(ReflectedTable $table, array $columnNames): String
  40. {
  41. $results = array();
  42. foreach ($columnNames as $columnName) {
  43. $column = $table->get($columnName);
  44. $quotedColumnName = $this->quoteColumnName($column);
  45. $quotedColumnName = $this->converter->convertColumnName($column, $quotedColumnName);
  46. $results[] = $quotedColumnName;
  47. }
  48. return implode(',', $results);
  49. }
  50. public function getInsert(ReflectedTable $table, array $columnValues): String
  51. {
  52. $columns = array();
  53. $values = array();
  54. foreach ($columnValues as $columnName => $columnValue) {
  55. $column = $table->get($columnName);
  56. $quotedColumnName = $this->quoteColumnName($column);
  57. $columns[] = $quotedColumnName;
  58. $columnValue = $this->converter->convertColumnValue($column);
  59. $values[] = $columnValue;
  60. }
  61. $columnsSql = '(' . implode(',', $columns) . ')';
  62. $valuesSql = '(' . implode(',', $values) . ')';
  63. $outputColumn = $this->quoteColumnName($table->getPk());
  64. switch ($this->driver) {
  65. case 'mysql':return "$columnsSql VALUES $valuesSql";
  66. case 'pgsql':return "$columnsSql VALUES $valuesSql RETURNING $outputColumn";
  67. case 'sqlsrv':return "$columnsSql OUTPUT INSERTED.$outputColumn VALUES $valuesSql";
  68. }
  69. }
  70. public function getUpdate(ReflectedTable $table, array $columnValues): String
  71. {
  72. $results = array();
  73. foreach ($columnValues as $columnName => $columnValue) {
  74. $column = $table->get($columnName);
  75. $quotedColumnName = $this->quoteColumnName($column);
  76. $columnValue = $this->converter->convertColumnValue($column);
  77. $results[] = $quotedColumnName . '=' . $columnValue;
  78. }
  79. return implode(',', $results);
  80. }
  81. public function getIncrement(ReflectedTable $table, array $columnValues): String
  82. {
  83. $results = array();
  84. foreach ($columnValues as $columnName => $columnValue) {
  85. if (!is_numeric($columnValue)) {
  86. continue;
  87. }
  88. $column = $table->get($columnName);
  89. $quotedColumnName = $this->quoteColumnName($column);
  90. $columnValue = $this->converter->convertColumnValue($column);
  91. $results[] = $quotedColumnName . '=' . $quotedColumnName . '+' . $columnValue;
  92. }
  93. return implode(',', $results);
  94. }
  95. }