ModelGeneratorTable.php 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. <?php
  2. namespace BotKit\Tools;
  3. // Таблица БД для генератора кода
  4. /* Таблицу следует создавать в единственном числе, т.к. класс создастся с
  5. названием как раз имени. (Например: Для таблицы 'user' будет создан класс
  6. 'User') */
  7. class ModelGeneratorTable {
  8. private string $name;
  9. private array $columns;
  10. public function __construct(string $name, array $columns) {
  11. $this->name = $name;
  12. $this->columns = $columns;
  13. }
  14. // Возвращает название файла для класса
  15. public function getClassFileName() {
  16. return $this->getName().'Model.php';
  17. }
  18. // Возвращает название файла для трейта
  19. public function getTraitFileName() {
  20. return $this->getName().'Trait.php';
  21. }
  22. // Возвращает имя таблицы, переводит snake_case в CamelCase
  23. public function getName() {
  24. return str_replace('_', '', ucwords($this->name, '_'));
  25. }
  26. public function getTraitCode($template_string) : string {
  27. $create_params = '';
  28. $object_binds = '';
  29. $params_binds = '';
  30. $comments = '';
  31. $insert_columns = '';
  32. $insert_values = '';
  33. $update_sets = '';
  34. $max_column_length = 0;
  35. // Генерация параметров для функций
  36. $last_index = array_key_last($this->columns);
  37. foreach ($this->columns as $column_index => $column) {
  38. // Первичные колонки заполняются СУБД
  39. if ($column->isPrimary()) {
  40. continue;
  41. }
  42. $column_name = $column->getName();
  43. $max_column_length = max(mb_strlen($column_name), $max_column_length);
  44. $create_params .= "\$$column_name";
  45. $object_binds .= " \$statement->bindValue(':$column_name', \$object['$column_name']);\n";
  46. $params_binds .= " \$statement->bindValue(':$column_name', \$$column_name);\n";
  47. $insert_columns .= $column_name;
  48. $insert_values .= ":$column_name";
  49. $update_sets .= $column_name.'=:'.$column_name;
  50. if ($column_index != $last_index) {
  51. $insert_columns .= ',';
  52. $insert_values .= ',';
  53. $update_sets .= ',';
  54. $create_params .= ',';
  55. }
  56. }
  57. // Генерация комментариев
  58. $comment_line = " // %' -".($max_column_length + 1)."s: %s\n";
  59. foreach ($this->columns as $column) {
  60. if ($column->isPrimary()) {
  61. $col_comment = 'Первичный ключ';
  62. } else {
  63. $col_comment = $column->getComment();
  64. if (strlen($col_comment) == 0) {
  65. $col_comment = 'Комментарий не указан';
  66. }
  67. }
  68. $comments .= sprintf($comment_line,
  69. $column->getName(),
  70. $col_comment
  71. );
  72. }
  73. return sprintf($template_string,
  74. $this->getName().'Trait', // Название трейта
  75. $this->name, // Название таблицы
  76. $comments, // Пояснения колонок
  77. $create_params, // Параметры функции create()
  78. $this->name, // В какую таблицу вставляется запись при create()
  79. $insert_columns, // Колонки запроса вставки
  80. $insert_values, // Значения запроса вставки
  81. $params_binds, // Код привязки параметров (create)
  82. $this->name, // Название таблицы для CREATE
  83. $this->name, // Название таблицы для UPDATE
  84. $update_sets, // Запрос обновления (SET x=:x, y=:y...)
  85. $object_binds // Код привязки параметров (update)
  86. );
  87. }
  88. public function getClassCode($template_string) : string {
  89. return sprintf($template_string,
  90. $this->getName(),
  91. $this->getName().'Trait'
  92. );
  93. }
  94. }