22
33namespace Eghamat24 \DatabaseRepository \Commands ;
44
5+ use Illuminate \Support \Collection ;
56use Illuminate \Support \Str ;
67use Eghamat24 \DatabaseRepository \Creators \BaseCreator ;
78use Eghamat24 \DatabaseRepository \Creators \CreatorEnum ;
89use Eghamat24 \DatabaseRepository \CustomMySqlQueries ;
9- use Illuminate \Console \Command ;
1010
1111class MakeEnum extends BaseCommand
1212{
13+ use CustomMySqlQueries;
14+
1315 /**
1416 * The name and signature of the console command.
1517 *
@@ -27,38 +29,83 @@ class MakeEnum extends BaseCommand
2729 */
2830 protected $ description = 'Create a new enum(s). ' ;
2931
30- use CustomMySqlQueries;
31-
3232 public function handle (): void
3333 {
3434 $ this ->setArguments ();
3535 $ columns = $ this ->getAllColumnsInTable ($ this ->tableName );
3636
3737 $ this ->checkEmpty ($ columns , $ this ->tableName );
3838
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 );
4840
4941 $ attributeStub = file_get_contents ($ this ->enumStubPath . 'attribute.stub ' );
5042
5143 foreach ($ enums as $ enumName => $ enum ) {
5244 $ filenameWithPath = $ this ->relativeEnumsPath . $ enumName . '.php ' ;
5345
5446 $ this ->checkDirectory ($ this ->enumNamespace );
55- $ this ->checkClassExist ($ this ->relativeEnumsPath , $ enumName , " Enum " );
47+ $ this ->checkClassExist ($ this ->relativeEnumsPath , $ enumName , ' Enum ' );
5648
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 );
6051
6152 $ this ->finalized ($ filenameWithPath , $ enumName , $ baseContent );
6253 }
6354 }
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+ }
64111}
0 commit comments