44
55namespace McMatters \NullableAttributes \Console ;
66
7- use File ;
87use Illuminate \Console \Command ;
98use Illuminate \Database \Eloquent \Model ;
9+ use Illuminate \Database \Eloquent \Relations \Pivot ;
10+ use Illuminate \Support \Facades \DB ;
11+ use Illuminate \Support \Facades \File ;
1012use ReflectionClass ;
1113use ReflectionException ;
1214use Symfony \Component \ClassLoader \ClassMapGenerator ;
@@ -33,21 +35,24 @@ class Cache extends Command
3335 */
3436 public function handle ()
3537 {
36- $ models = $ this ->loadModels ();
38+ $ models = $ this ->getModels ();
3739 $ nullables = $ this ->findNullables ($ models );
40+
3841 $ content = '<?php ' .PHP_EOL .'return ' .var_export ($ nullables , true ).'; ' ;
39- $ fileName = storage_path ( ' app/nullable_attributes.php ' );
42+ $ fileName = config ( ' nullable-attributes.cache ' );
4043 File::put ($ fileName , $ content );
44+
4145 $ this ->info ("Successfully written to the {$ fileName }" );
4246 }
4347
4448 /**
4549 * @return array
4650 */
47- protected function loadModels (): array
51+ protected function getModels (): array
4852 {
4953 $ models = [];
50- $ dir = config ('nullable-attributes.folder ' );
54+ $ dir = config ('nullable-attributes.models ' );
55+
5156 foreach (ClassMapGenerator::createMap ($ dir ) as $ model => $ path ) {
5257 try {
5358 $ reflection = new ReflectionClass ($ model );
@@ -56,6 +61,7 @@ protected function loadModels(): array
5661 }
5762
5863 if ($ reflection ->isInstantiable () &&
64+ !$ reflection ->isSubclassOf (Pivot::class) &&
5965 $ reflection ->isSubclassOf (Model::class)
6066 ) {
6167 $ models [] = $ model ;
@@ -73,10 +79,43 @@ protected function loadModels(): array
7379 protected function findNullables (array $ models ): array
7480 {
7581 $ nullables = [];
82+
7683 foreach ($ models as $ model ) {
77- $ nullables [$ model ] = get_model_nullable_attributes ($ model );
84+ $ nullables [$ model ] = $ this -> getNullablesFromDb ($ model );
7885 }
7986
8087 return $ nullables ;
8188 }
89+
90+ /**
91+ * @param string $model
92+ *
93+ * @return array
94+ */
95+ protected function getNullablesFromDb (string $ model ): array
96+ {
97+ static $ manager ;
98+
99+ if (null === $ manager ) {
100+ $ manager = DB ::getDoctrineSchemaManager ();
101+ }
102+
103+ $ attributes = [];
104+
105+ $ table = (new $ model )->getTable ();
106+ /** @var array $columns */
107+ $ columns = $ manager ->tryMethod ('listTableColumns ' , $ table );
108+
109+ if (!$ columns ) {
110+ return [];
111+ }
112+
113+ foreach ($ columns as $ column ) {
114+ if (!$ column ->getNotnull () && null === $ column ->getDefault ()) {
115+ $ attributes [] = $ column ->getName ();
116+ }
117+ }
118+
119+ return $ attributes ;
120+ }
82121}
0 commit comments