From 02ec719447f7af58c9f2885beebe5111c2fb31ff Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Willian=20Leite=20Ara=C3=BAjo?= Date: Tue, 24 Sep 2024 07:47:25 -0300 Subject: [PATCH] * Fix compatibility gap to Laravel 11 --- src/Utils/SchemaUtils.php | 137 +++++++++++++++++++++++--------------- 1 file changed, 85 insertions(+), 52 deletions(-) diff --git a/src/Utils/SchemaUtils.php b/src/Utils/SchemaUtils.php index 38d832e..d7bdb9c 100644 --- a/src/Utils/SchemaUtils.php +++ b/src/Utils/SchemaUtils.php @@ -3,69 +3,103 @@ namespace San\Crud\Utils; use Illuminate\Support\Facades\DB; +use Illuminate\Support\Facades\Schema; +use Illuminate\Support\Str; class SchemaUtils { - public static function getTables(string|array $exclude, bool $withViews = TRUE) { - $tables = DB::connection()->getDoctrineSchemaManager()->listTableNames(); - if ($withViews) { - $views = DB::connection()->getDoctrineSchemaManager()->listViews(); - $tables = array_merge($tables, array_keys($views)); + public static function getTables(string|array $exclude) { + if(method_exists(DB::connection(),'getDoctrineSchemaManager')){ + $tables = DB::connection()->getDoctrineSchemaManager()->listTableNames(); + } else { + $tables = Schema::getTableListing(); } - return array_values(array_filter($tables, fn($table) => !in_array($table, (array) $exclude))); + } public static function getTableFields(string $tableName, array $excludedColumns = [], array $alwaysIgnoredColumns = ['id', 'created_at', 'updated_at', 'deleted_at']) { + $ignoredColumns = array_merge((array) $excludedColumns, (array) $alwaysIgnoredColumns); // ugly enum hack as doctrine does not support enum types // https://www.doctrine-project.org/projects/doctrine-orm/en/latest/cookbook/mysql-enums.html#solution-1-mapping-to-varchars - - DB::connection()->getDoctrineSchemaManager()->getDatabasePlatform()->registerDoctrineTypeMapping('enum', 'guid'); - - $columns = DB::getDoctrineSchemaManager()->listTableColumns($tableName); - $ignoredColumns = array_merge((array) $excludedColumns, (array) $alwaysIgnoredColumns); - $indexes = DB::getDoctrineSchemaManager()->listTableIndexes($tableName); - $uniqueColumns = []; - - foreach ($indexes as $index) { - if ($index->isUnique() && count($index->getColumns()) === 1) { - $uniqueColumns = array_merge($uniqueColumns, $index->getColumns()); + if(method_exists(DB::connection(),'getDoctrineSchemaManager')){ + DB::connection()->getDoctrineSchemaManager()->getDatabasePlatform()->registerDoctrineTypeMapping('enum', 'guid'); + + $indexes = DB::getDoctrineSchemaManager()->listTableIndexes($tableName); + $uniqueColumns = []; + foreach ($indexes as $index) { + if ($index->isUnique() && count($index->getColumns()) === 1) { + $uniqueColumns = array_merge($uniqueColumns, $index->getColumns()); + } + } + $columns = DB::getDoctrineSchemaManager()->listTableColumns($tableName); + foreach ($columns as $column) { + if (in_array($column->getName(), $ignoredColumns)) continue; + + $field = ['id' => $column->getName(), 'type' => $column->getType()->getName(), 'name' => Str::title(str_replace('_', ' ', $column->getName())), 'nullable' => !$column->getNotnull()]; + + if ($field['type'] == 'guid') { + try { + $enums = DB::select("SHOW COLUMNS FROM $tableName WHERE Field = '$field[name]'"); + $field['values'] = explode(',', str_replace("'", '', substr($enums[0]->Type, 5, -1))); + } catch (\Throwable $e) { + } + } + + if (preg_match('/^(.*?)_id$/', $field['id'], $matches)) { + $relatedTable = Str::plural($matches[1]); + if (self::tableExists($relatedTable)) { + $field['relation'] = $matches[1]; + $field['related_table'] = $relatedTable; + } + } + + //check if column is unique index + if (in_array($field['id'], $uniqueColumns)) { + $field['unique'] = TRUE; + } + $fields[] = $field; } + } - - foreach ($columns as $column) { - if (in_array($column->getName(), $ignoredColumns)) continue; - - $field = [ - 'id' => $column->getName(), - 'type' => $column->getType()->getName(), - 'name' => \Str::title(str_replace('_', ' ', $column->getName())), - 'nullable' => !$column->getNotnull(), - 'default' => $column->getDefault(), - ]; - - if ($field['type'] == 'guid') { - try { - $enums = DB::select("SHOW COLUMNS FROM $tableName WHERE Field = '$field[id]'"); - $field['values'] = explode(',', str_replace("'", '', substr($enums[0]->Type, 5, -1))); - } catch (\Throwable $e) { - echo ''; + else{ // Laravel 11 upgrade changes: https://laravel.com/docs/11.x/upgrade#doctrine-dbal-removal + $columns = Schema::getColumns($tableName); + $indexes = Schema::getIndexes($tableName); + $uniqueColumns = []; + foreach ($indexes as $index) { + if ($index['unique'] && count($index['columns']) === 1) { + $uniqueColumns = array_merge($uniqueColumns, $index['columns']); } } - if (preg_match('/^(.*?)_id$/', $field['id'], $matches)) { - $relatedTable = \Str::plural($matches[1]); - if (self::tableExists($relatedTable)) { - $field['relation'] = $matches[1]; - $field['related_table'] = $relatedTable; + foreach ($columns as $column) { + if (in_array($column['name'], $ignoredColumns)) continue; + + $field = ['id' => $column['name'], 'type' => $column['type_name'], 'name' => Str::title(str_replace('_', ' ', $column['name'])), 'nullable' => !$column['nullable']]; + + if ($field['type'] == 'guid') { + try { + $enums = DB::select("SHOW COLUMNS FROM $tableName WHERE Field = '$field[name]'"); + $field['values'] = explode(',', str_replace("'", '', substr($enums[0]->Type, 5, -1))); + } catch (\Throwable $e) { + } } + + if (preg_match('/^(.*?)_id$/', $field['id'], $matches)) { + $relatedTable = Str::plural($matches[1]);//@test Portuguese conversions + if (self::tableExists($relatedTable)) { + $field['relation'] = $matches[1]; + $field['related_table'] = $relatedTable; + } + } + + //check if column is unique index + if (in_array($field['id'], $uniqueColumns)) { + $field['unique'] = TRUE; + } + + $fields[] = $field; } - - //check if column is unique index - if (in_array($field['id'], $uniqueColumns)) { - $field['unique'] = TRUE; - } - - $fields[] = $field; + } return $fields ?? []; @@ -86,29 +120,28 @@ public static function firstHumanReadableField(string $table, string $key = NULL } public static function getTableFieldsWithIds(string $table, array $excludedColumns = []) { + return array_values(array_filter(self::getTableFields($table, $excludedColumns), fn($f) => !empty($f['relation']))); } public static function getUserIdField(string $tableName, $userIdField = 'user_id') { - if (!self::tableExists($tableName)) return NULL; + if (!self::hasTable($tableName)) return NULL; return \Schema::hasColumn($tableName, $userIdField) ? $userIdField : NULL; } public static function hasTable(string $tableName) { - return self::tableExists($tableName); + return \Schema::hasTable($tableName); } public static function hasTimestamps(string $tableName) { - if (!self::tableExists($tableName)) return FALSE; return \Schema::hasColumn($tableName, 'created_at') && \Schema::hasColumn($tableName, 'updated_at'); } public static function hasSoftDelete(string $tableName) { - if (!self::tableExists($tableName)) return FALSE; return \Schema::hasColumn($tableName, 'deleted_at'); } public static function tableExists(string $tableName) { - return \Schema::hasTable($tableName); + return DB::connection()->getSchemaBuilder()->hasTable($tableName); } }