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

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  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 $columns;
  8. private $pk;
  9. private $fks;
  10. public function __construct(String $name, array $columns)
  11. {
  12. $this->name = $name;
  13. // set columns
  14. $this->columns = [];
  15. foreach ($columns as $column) {
  16. $columnName = $column->getName();
  17. $this->columns[$columnName] = $column;
  18. }
  19. // set primary key
  20. $this->pk = null;
  21. foreach ($columns as $column) {
  22. if ($column->getPk() == true) {
  23. $this->pk = $column;
  24. }
  25. }
  26. // set foreign keys
  27. $this->fks = [];
  28. foreach ($columns as $column) {
  29. $columnName = $column->getName();
  30. $referencedTableName = $column->getFk();
  31. if ($referencedTableName != '') {
  32. $this->fks[$columnName] = $referencedTableName;
  33. }
  34. }
  35. }
  36. public static function fromReflection(GenericReflection $reflection, array $tableResult): ReflectedTable
  37. {
  38. $name = $tableResult['TABLE_NAME'];
  39. // set columns
  40. $columns = [];
  41. foreach ($reflection->getTableColumns($name) as $tableColumn) {
  42. $column = ReflectedColumn::fromReflection($reflection, $tableColumn);
  43. $columns[$column->getName()] = $column;
  44. }
  45. // set primary key
  46. $columnNames = $reflection->getTablePrimaryKeys($name);
  47. if (count($columnNames) == 1) {
  48. $columnName = $columnNames[0];
  49. if (isset($columns[$columnName])) {
  50. $pk = $columns[$columnName];
  51. $pk->setPk(true);
  52. }
  53. }
  54. // set foreign keys
  55. $fks = $reflection->getTableForeignKeys($name);
  56. foreach ($fks as $columnName => $table) {
  57. $columns[$columnName]->setFk($table);
  58. }
  59. return new ReflectedTable($name, array_values($columns));
  60. }
  61. public static function fromJson( /* object */$json): ReflectedTable
  62. {
  63. $name = $json->name;
  64. $columns = [];
  65. if (isset($json->columns) && is_array($json->columns)) {
  66. foreach ($json->columns as $column) {
  67. $columns[] = ReflectedColumn::fromJson($column);
  68. }
  69. }
  70. return new ReflectedTable($name, $columns);
  71. }
  72. public function exists(String $columnName): bool
  73. {
  74. return isset($this->columns[$columnName]);
  75. }
  76. public function hasPk(): bool
  77. {
  78. return $this->pk != null;
  79. }
  80. public function getPk(): ReflectedColumn
  81. {
  82. return $this->pk;
  83. }
  84. public function getName(): String
  85. {
  86. return $this->name;
  87. }
  88. public function columnNames(): array
  89. {
  90. return array_keys($this->columns);
  91. }
  92. public function get($columnName): ReflectedColumn
  93. {
  94. return $this->columns[$columnName];
  95. }
  96. public function getFksTo(String $tableName): array
  97. {
  98. $columns = array();
  99. foreach ($this->fks as $columnName => $referencedTableName) {
  100. if ($tableName == $referencedTableName) {
  101. $columns[] = $this->columns[$columnName];
  102. }
  103. }
  104. return $columns;
  105. }
  106. public function serialize()
  107. {
  108. return [
  109. 'name' => $this->name,
  110. 'columns' => array_values($this->columns),
  111. ];
  112. }
  113. public function jsonSerialize()
  114. {
  115. return $this->serialize();
  116. }
  117. }