Skip to content

Commit 39e3fbd

Browse files
- Update dependencies to support Laravel 11 and 12.
- Remove unsupported "laravelcollective/html". - Solving "Method Illuminate\Database\MySqlConnection::getDoctrineSchemaManager does not exist." error. Ref: InfyOmLabs#1101
1 parent a116c7d commit 39e3fbd

File tree

4 files changed

+77
-63
lines changed

4 files changed

+77
-63
lines changed

composer.json

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -23,18 +23,17 @@
2323
}],
2424
"require": {
2525
"php": "^8.1.0",
26-
"illuminate/support": "^10.0",
27-
"illuminate/console": "^10.0",
26+
"illuminate/support": "^10.0|^11.0|^12.0",
27+
"illuminate/console": "^10.0|^11.0|^12.0",
2828
"laracasts/flash": "^3.2.2",
29-
"laravelcollective/html": "^6.4",
30-
"symfony/var-exporter": "^6.2.5"
29+
"symfony/var-exporter": "^6.2.5|^7.0"
3130
},
3231
"require-dev": {
3332
"phpunit/phpunit": "^10.0.7",
3433
"mockery/mockery": "^1.5.1",
35-
"orchestra/testbench": "^8.0.0",
36-
"pestphp/pest": "2.x-dev",
37-
"pestphp/pest-plugin-laravel": "2.x-dev"
34+
"orchestra/testbench": "^8.0|^9.0|^10.0",
35+
"pestphp/pest": "^2.0|^3.0",
36+
"pestphp/pest-plugin-laravel": "^2.0|^3.0"
3837
},
3938
"autoload": {
4039
"psr-4": {

src/Generators/ModelGenerator.php

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -203,8 +203,9 @@ protected function generateRules(): array
203203
$rule[] = 'string';
204204

205205
// Enforce a maximum string length if possible.
206-
if ((int) $field->fieldDetails->getLength() > 0) {
207-
$rule[] = 'max:'.$field->fieldDetails->getLength();
206+
$length = get_field_length($field->fieldDetails['type']);
207+
if ((int) $length > 1) {
208+
$rule[] = 'max:'.$length;
208209
}
209210
break;
210211
}

src/Utils/TableFieldsGenerator.php

Lines changed: 41 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,11 @@
22

33
namespace InfyOm\Generator\Utils;
44

5-
use DB;
65
use Doctrine\DBAL\Schema\AbstractSchemaManager;
76
use Doctrine\DBAL\Schema\Column;
7+
use Illuminate\Support\Facades\Schema;
88
use Illuminate\Support\Str;
9+
use InfyOm\Generator\Common\GeneratorConfig;
910
use InfyOm\Generator\Common\GeneratorField;
1011
use InfyOm\Generator\Common\GeneratorFieldRelation;
1112

@@ -59,39 +60,17 @@ class TableFieldsGenerator
5960
/** @var \Doctrine\DBAL\Schema\Table */
6061
public $tableDetails;
6162

63+
public GeneratorConfig $config;
64+
6265
public function __construct($tableName, $ignoredFields, $connection = '')
6366
{
6467
$this->tableName = $tableName;
6568
$this->ignoredFields = $ignoredFields;
6669

67-
if (!empty($connection)) {
68-
$this->schemaManager = DB::connection($connection)->getDoctrineSchemaManager();
69-
} else {
70-
$this->schemaManager = DB::getDoctrineSchemaManager();
71-
}
72-
73-
$platform = $this->schemaManager->getDatabasePlatform();
74-
$defaultMappings = [
75-
'enum' => 'string',
76-
'json' => 'text',
77-
'bit' => 'boolean',
78-
];
79-
80-
// $this->tableDetails = $this->schemaManager->listTableDetails($this->tableName);
81-
82-
$mappings = config('laravel_generator.from_table.doctrine_mappings', []);
83-
$mappings = array_merge($mappings, $defaultMappings);
84-
foreach ($mappings as $dbType => $doctrineType) {
85-
$platform->registerDoctrineTypeMapping($dbType, $doctrineType);
86-
}
87-
// Added
88-
$this->tableDetails = $this->schemaManager->listTableDetails($this->tableName);
89-
90-
$columns = $this->schemaManager->listTableColumns($tableName);
91-
70+
$columns = Schema::getColumns($tableName);
9271
$this->columns = [];
9372
foreach ($columns as $column) {
94-
if (!in_array($column->getName(), $ignoredFields)) {
73+
if (!in_array($column['name'], $ignoredFields)) {
9574
$this->columns[] = $column;
9675
}
9776
}
@@ -107,7 +86,7 @@ public function __construct($tableName, $ignoredFields, $connection = '')
10786
public function prepareFieldsFromTable()
10887
{
10988
foreach ($this->columns as $column) {
110-
$type = $column->getType()->getName();
89+
$type = $column['type_name'];
11190

11291
switch ($type) {
11392
case 'integer':
@@ -120,7 +99,7 @@ public function prepareFieldsFromTable()
12099
$field = $this->generateIntFieldInput($column, 'bigInteger');
121100
break;
122101
case 'boolean':
123-
$name = Str::title(str_replace('_', ' ', $column->getName()));
102+
$name = Str::title(str_replace('_', ' ', $column['name']));
124103
$field = $this->generateField($column, 'boolean', 'checkbox');
125104
break;
126105
case 'datetime':
@@ -160,8 +139,8 @@ public function prepareFieldsFromTable()
160139
$field->inIndex = false;
161140
$field->inView = false;
162141
}
163-
$field->isNotNull = $column->getNotNull();
164-
$field->description = $column->getComment() ?? ''; // get comments from table
142+
$field->isNotNull = !$column['nullable'];
143+
$field->description = $column['comment'] ?? ''; // get comments from table
165144

166145
$this->fields[] = $field;
167146
}
@@ -176,9 +155,14 @@ public function prepareFieldsFromTable()
176155
*/
177156
public function getPrimaryKeyOfTable($tableName)
178157
{
179-
$column = $this->schemaManager->listTableDetails($tableName)->getPrimaryKey();
158+
$column = '';
159+
foreach (Schema::getIndexes($tableName) as $index) {
160+
if ($index['primary']) {
161+
$column = $index['columns'][0];
162+
}
163+
}
180164

181-
return $column ? $column->getColumns()[0] : '';
165+
return $column;
182166
}
183167

184168
/**
@@ -210,17 +194,17 @@ public static function getTimestampFieldNames()
210194
private function generateIntFieldInput($column, $dbType)
211195
{
212196
$field = new GeneratorField();
213-
$field->name = $column->getName();
197+
$field->name = $column['name'];
214198
$field->parseDBType($dbType);
215199
$field->htmlType = 'number';
216200

217-
if ($column->getAutoincrement()) {
201+
if ($column['auto_increment']) {
218202
$field->dbType .= ',true';
219203
} else {
220204
$field->dbType .= ',false';
221205
}
222206

223-
if ($column->getUnsigned()) {
207+
if (str_contains($column['type'], 'unsigned')) {
224208
$field->dbType .= ',true';
225209
}
226210

@@ -260,8 +244,8 @@ private function checkForPrimary(GeneratorField $field)
260244
private function generateField($column, $dbType, $htmlType)
261245
{
262246
$field = new GeneratorField();
263-
$field->name = $column->getName();
264-
$field->fieldDetails = $this->tableDetails->getColumn($field->name);
247+
$field->name = $column['name'];
248+
$field->fieldDetails = $column;
265249
$field->parseDBType($dbType); //, $column); TODO: handle column param
266250
$field->parseHtmlInput($htmlType);
267251

@@ -279,12 +263,13 @@ private function generateField($column, $dbType, $htmlType)
279263
private function generateNumberInput($column, $dbType)
280264
{
281265
$field = new GeneratorField();
282-
$field->name = $column->getName();
283-
$field->parseDBType($dbType.','.$column->getPrecision().','.$column->getScale());
266+
$field->name = $column['name'];
267+
$length = get_field_length($column['type']);
268+
$field->parseDBType($dbType.','.get_field_precision($length).','.get_field_scale($length));
284269
$field->htmlType = 'number';
285270

286271
if ($dbType === 'decimal') {
287-
$field->numberDecimalPoints = $column->getScale();
272+
$field->numberDecimalPoints = explode(',', $length)[1];
288273
}
289274

290275
return $this->checkForPrimary($field);
@@ -306,25 +291,27 @@ public function prepareRelations()
306291
*/
307292
public function prepareForeignKeys()
308293
{
309-
$tables = $this->schemaManager->listTables();
294+
$tables = Schema::getTables();
310295

311296
$fields = [];
312297

313298
foreach ($tables as $table) {
314-
$primaryKey = $table->getPrimaryKey();
315-
if ($primaryKey) {
316-
$primaryKey = $primaryKey->getColumns()[0];
299+
$primaryKey = '';
300+
foreach (Schema::getIndexes($table['name']) as $index) {
301+
if ($index['primary']) {
302+
$primaryKey = $index['columns'][0];
303+
}
317304
}
318305
$formattedForeignKeys = [];
319-
$tableForeignKeys = $table->getForeignKeys();
306+
$tableForeignKeys = Schema::getForeignKeys($table['name']);
320307
foreach ($tableForeignKeys as $tableForeignKey) {
321308
$generatorForeignKey = new GeneratorForeignKey();
322-
$generatorForeignKey->name = $tableForeignKey->getName();
323-
$generatorForeignKey->localField = $tableForeignKey->getLocalColumns()[0];
324-
$generatorForeignKey->foreignField = $tableForeignKey->getForeignColumns()[0];
325-
$generatorForeignKey->foreignTable = $tableForeignKey->getForeignTableName();
326-
$generatorForeignKey->onUpdate = $tableForeignKey->onUpdate();
327-
$generatorForeignKey->onDelete = $tableForeignKey->onDelete();
309+
$generatorForeignKey->name = $tableForeignKey['name'];
310+
$generatorForeignKey->localField = $tableForeignKey['columns'][0];
311+
$generatorForeignKey->foreignField = $tableForeignKey['foreign_columns'][0];
312+
$generatorForeignKey->foreignTable = $tableForeignKey['foreign_table'];
313+
$generatorForeignKey->onUpdate = $tableForeignKey['on_update'];
314+
$generatorForeignKey->onDelete = $tableForeignKey['on_delete'];
328315

329316
$formattedForeignKeys[] = $generatorForeignKey;
330317
}
@@ -333,7 +320,7 @@ public function prepareForeignKeys()
333320
$generatorTable->primaryKey = $primaryKey;
334321
$generatorTable->foreignKeys = $formattedForeignKeys;
335322

336-
$fields[$table->getName()] = $generatorTable;
323+
$fields[$table['name']] = $generatorTable;
337324
}
338325

339326
return $fields;
@@ -550,4 +537,4 @@ private function detectManyToOne($tables, $modelTable)
550537

551538
return $manyToOneRelations;
552539
}
553-
}
540+
}

src/helpers.php

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,3 +74,30 @@ function create_resource_route_names($name, $isScaffold = false): array
7474
return $result;
7575
}
7676
}
77+
78+
if (!function_exists('get_field_length')) {
79+
function get_field_length($type): string
80+
{
81+
preg_match('/\(\s*(\d+(?:,\s*\d+)*)\s*\)/', $type, $matches);
82+
83+
return $matches[1] ?? 0;
84+
}
85+
}
86+
87+
if (!function_exists('get_field_precision')) {
88+
function get_field_precision($length): int
89+
{
90+
$precision = explode(',', $length);
91+
92+
return $precision[0] ?? 0;
93+
}
94+
}
95+
96+
if (!function_exists('get_field_scale')) {
97+
function get_field_scale($length): int
98+
{
99+
$precision = explode(',', $length);
100+
101+
return $precision[1] ?? 0;
102+
}
103+
}

0 commit comments

Comments
 (0)