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.

ReflectedTable.php 3.9KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149
  1. <?php
  2. namespace Tqdev\PhpCrudApi\Column\Reflection;
  3. use Tqdev\PhpCrudApi\Database\GenericReflection;
  4. class ReflectedTable implements \JsonSerializable
  5. {
  6. private $name;
  7. private $type;
  8. private $columns;
  9. private $pk;
  10. private $fks;
  11. public function __construct(string $name, string $type, array $columns)
  12. {
  13. $this->name = $name;
  14. $this->type = $type;
  15. // set columns
  16. $this->columns = [];
  17. foreach ($columns as $column) {
  18. $columnName = $column->getName();
  19. $this->columns[$columnName] = $column;
  20. }
  21. // set primary key
  22. $this->pk = null;
  23. foreach ($columns as $column) {
  24. if ($column->getPk() == true) {
  25. $this->pk = $column;
  26. }
  27. }
  28. // set foreign keys
  29. $this->fks = [];
  30. foreach ($columns as $column) {
  31. $columnName = $column->getName();
  32. $referencedTableName = $column->getFk();
  33. if ($referencedTableName != '') {
  34. $this->fks[$columnName] = $referencedTableName;
  35. }
  36. }
  37. }
  38. public static function fromReflection(GenericReflection $reflection, string $name, string $type): ReflectedTable
  39. {
  40. // set columns
  41. $columns = [];
  42. foreach ($reflection->getTableColumns($name, $type) as $tableColumn) {
  43. $column = ReflectedColumn::fromReflection($reflection, $tableColumn);
  44. $columns[$column->getName()] = $column;
  45. }
  46. // set primary key
  47. $columnNames = $reflection->getTablePrimaryKeys($name);
  48. if (count($columnNames) == 1) {
  49. $columnName = $columnNames[0];
  50. if (isset($columns[$columnName])) {
  51. $pk = $columns[$columnName];
  52. $pk->setPk(true);
  53. }
  54. }
  55. // set foreign keys
  56. $fks = $reflection->getTableForeignKeys($name);
  57. foreach ($fks as $columnName => $table) {
  58. $columns[$columnName]->setFk($table);
  59. }
  60. return new ReflectedTable($name, $type, array_values($columns));
  61. }
  62. public static function fromJson(/* object */$json): ReflectedTable
  63. {
  64. $name = $json->name;
  65. $type = $json->type;
  66. $columns = [];
  67. if (isset($json->columns) && is_array($json->columns)) {
  68. foreach ($json->columns as $column) {
  69. $columns[] = ReflectedColumn::fromJson($column);
  70. }
  71. }
  72. return new ReflectedTable($name, $type, $columns);
  73. }
  74. public function hasColumn(string $columnName): bool
  75. {
  76. return isset($this->columns[$columnName]);
  77. }
  78. public function hasPk(): bool
  79. {
  80. return $this->pk != null;
  81. }
  82. public function getPk() /*: ?ReflectedColumn */
  83. {
  84. return $this->pk;
  85. }
  86. public function getName(): string
  87. {
  88. return $this->name;
  89. }
  90. public function getType(): string
  91. {
  92. return $this->type;
  93. }
  94. public function getColumnNames(): array
  95. {
  96. return array_keys($this->columns);
  97. }
  98. public function getColumn($columnName): ReflectedColumn
  99. {
  100. return $this->columns[$columnName];
  101. }
  102. public function getFksTo(string $tableName): array
  103. {
  104. $columns = array();
  105. foreach ($this->fks as $columnName => $referencedTableName) {
  106. if ($tableName == $referencedTableName) {
  107. $columns[] = $this->columns[$columnName];
  108. }
  109. }
  110. return $columns;
  111. }
  112. public function removeColumn(string $columnName): bool
  113. {
  114. if (!isset($this->columns[$columnName])) {
  115. return false;
  116. }
  117. unset($this->columns[$columnName]);
  118. return true;
  119. }
  120. public function serialize()
  121. {
  122. return [
  123. 'name' => $this->name,
  124. 'type' => $this->type,
  125. 'columns' => array_values($this->columns),
  126. ];
  127. }
  128. public function jsonSerialize()
  129. {
  130. return $this->serialize();
  131. }
  132. }