2
2
3
3
namespace Eghamat24 \DatabaseRepository \Commands ;
4
4
5
+ use Illuminate \Support \Collection ;
5
6
use Illuminate \Support \Str ;
6
7
use Eghamat24 \DatabaseRepository \Creators \BaseCreator ;
7
8
use Eghamat24 \DatabaseRepository \Creators \CreatorEnum ;
8
9
use Eghamat24 \DatabaseRepository \CustomMySqlQueries ;
9
- use Illuminate \Console \Command ;
10
10
11
11
class MakeEnum extends BaseCommand
12
12
{
13
+ use CustomMySqlQueries;
14
+
13
15
/**
14
16
* The name and signature of the console command.
15
17
*
@@ -27,38 +29,83 @@ class MakeEnum extends BaseCommand
27
29
*/
28
30
protected $ description = 'Create a new enum(s). ' ;
29
31
30
- use CustomMySqlQueries;
31
-
32
32
public function handle (): void
33
33
{
34
34
$ this ->setArguments ();
35
35
$ columns = $ this ->getAllColumnsInTable ($ this ->tableName );
36
36
37
37
$ this ->checkEmpty ($ columns , $ this ->tableName );
38
38
39
- $ enums = [];
40
- foreach ($ columns as $ _column ) {
41
- if ($ _column ->DATA_TYPE == 'enum ' ) {
42
- $ enumClassName = Str::studly (Str::singular (ucfirst (Str::camel ($ _column ->TABLE_NAME ))) . '_ ' . $ _column ->COLUMN_NAME ) . "Enum " ;
43
- $ enums [$ enumClassName ] = array_filter (explode (', ' , str_replace (['enum( ' , '\'' , ') ' ], ['' , '' , '' ], $ _column ->COLUMN_TYPE )));
44
- $ filenameWithPath = $ this ->relativeEnumsPath . $ enumClassName . '.php ' ;
45
- $ this ->checkDelete ($ filenameWithPath , $ enumClassName , "Enum " );
46
- }
47
- }
39
+ $ enums = $ this ->extractEnumsFromColumns ($ columns );
48
40
49
41
$ attributeStub = file_get_contents ($ this ->enumStubPath . 'attribute.stub ' );
50
42
51
43
foreach ($ enums as $ enumName => $ enum ) {
52
44
$ filenameWithPath = $ this ->relativeEnumsPath . $ enumName . '.php ' ;
53
45
54
46
$ this ->checkDirectory ($ this ->enumNamespace );
55
- $ this ->checkClassExist ($ this ->relativeEnumsPath , $ enumName , " Enum " );
47
+ $ this ->checkClassExist ($ this ->relativeEnumsPath , $ enumName , ' Enum ' );
56
48
57
- $ enumCreator = new CreatorEnum ($ columns , $ attributeStub , $ enum , $ enumName , $ this ->enumNamespace );
58
- $ creator = new BaseCreator ($ enumCreator );
59
- $ baseContent = $ creator ->createClass ($ filenameWithPath , $ this );
49
+ $ baseContent = $ this ->getBaseCreator ($ columns , $ attributeStub , $ enum , $ enumName )
50
+ ->createClass ($ filenameWithPath , $ this );
60
51
61
52
$ this ->finalized ($ filenameWithPath , $ enumName , $ baseContent );
62
53
}
63
54
}
55
+
56
+
57
+ /**
58
+ * @param Collection $columns
59
+ * @return array
60
+ */
61
+ public function extractEnumsFromColumns (Collection $ columns ): array
62
+ {
63
+ $ enums = [];
64
+ foreach ($ columns as $ _column ) {
65
+
66
+ if ($ _column ->DATA_TYPE !== 'enum ' ) {
67
+ continue ;
68
+ }
69
+
70
+ $ enumClassName = $ this ->getEnumClassName ($ _column );
71
+ $ enums [$ enumClassName ] = $ this ->extractEnumValues ($ _column ->COLUMN_TYPE );
72
+
73
+ $ this ->checkDelete (
74
+ $ this ->relativeEnumsPath . $ enumClassName . '.php ' ,
75
+ $ enumClassName ,
76
+ 'Enum '
77
+ );
78
+ }
79
+
80
+ return $ enums ;
81
+ }
82
+
83
+ private function getEnumClassName (mixed $ _column ): string
84
+ {
85
+ $ tableName = ucfirst (Str::camel ($ _column ->TABLE_NAME ));
86
+ $ columnName = $ _column ->COLUMN_NAME ;
87
+
88
+ return Str::studly (Str::singular ($ tableName ) . '_ ' . $ columnName ) . 'Enum ' ;
89
+ }
90
+
91
+ private function extractEnumValues ($ columnType ): array
92
+ {
93
+ $ items = explode (', ' , str_replace (['enum( ' , '\'' , ') ' ], ['' , '' , '' ], $ columnType ));
94
+
95
+ return array_filter ($ items );
96
+ }
97
+
98
+ /**
99
+ * @param Collection $columns
100
+ * @param bool|string $attributeStub
101
+ * @param mixed $enum
102
+ * @param int|string $enumName
103
+ * @return BaseCreator
104
+ */
105
+ private function getBaseCreator (Collection $ columns , bool |string $ attributeStub , mixed $ enum , int |string $ enumName ): BaseCreator
106
+ {
107
+ $ enumCreator = new CreatorEnum ($ columns , $ attributeStub , $ enum , $ enumName , $ this ->enumNamespace );
108
+
109
+ return new BaseCreator ($ enumCreator );
110
+ }
64
111
}
0 commit comments