diff src/Generator/Model/ModelGenerator.php @ 24:31109c61ce02 codex

Refactor RelationshipNavigator formatting and implement belongsTo, hasMany, belongsToMany injection in ModelGenerator
author Luka Sitas <sitas.luka.97@gmail.com>
date Tue, 22 Apr 2025 21:37:44 -0400
parents 827efbf4d73c
children 555bfaa500ac
line wrap: on
line diff
--- a/src/Generator/Model/ModelGenerator.php	Fri Apr 11 20:50:20 2025 -0400
+++ b/src/Generator/Model/ModelGenerator.php	Tue Apr 22 21:37:44 2025 -0400
@@ -5,6 +5,7 @@
 use Symfony\Component\Console\Attribute\AsCommand;
 use Wizard\MagicForger\Generator\BaseGenerator;
 use Wizard\MagicForger\Helpers\RelationshipNavigator;
+use Illuminate\Support\Str;
 
 #[AsCommand(name: 'mf:model')]
 class ModelGenerator extends BaseGenerator
@@ -34,15 +35,13 @@
 
     /**
      * Execute the console command.
+     *
+     * @return mixed
      */
     public function handle()
     {
-
-        $belongs_to_many_relations = RelationshipNavigator::getRelations($this->getTableInput());
-				dd($belongs_to_many_relations);
-        echo $this->renderBelongsToMany($belongs_to_many_relations['hasManyThrough'][0]);
-        dd('here');
-        /* parent::handle(); */
+        // Delegate to parent handler (includes replacements and insertions)
+        return parent::handle();
     }
 
     /**
@@ -89,12 +88,13 @@
 
     protected function getSnippet($snippet_name)
     {
-        if (! isset($cached_snippets[$snippet_name])) {
-					$cached_snippets[$snippet_name] = $this->files->get(
-						$this->resolveStubPath("/snippets/$snippet_name.stub"));
+        // Cache snippet contents to avoid re-reading files
+        if (! isset(self::$cached_snippets[$snippet_name])) {
+            self::$cached_snippets[$snippet_name] = $this->files->get(
+                $this->resolveStubPath("/snippets/$snippet_name.stub"));
         }
 
-        return $cached_snippets[$snippet_name];
+        return self::$cached_snippets[$snippet_name];
     }
 
 		protected function gatherRelations() {
@@ -110,16 +110,19 @@
 				'hasMany' => [],
 				'belongsToMany' => [],
 			];
-			foreach($relations['belongsTo'] as $belongs_to_relation) {
-				$renders['belongsTo'] = $this->renderBelongsTo($belongs_to_relation);
-			}
+        // Render belongsTo relations
+        foreach (($relations['belongsTo'] ?? []) as $relation) {
+            $renders['belongsTo'][] = $this->renderBelongsTo($relation);
+        }
 
-			foreach($relations['hasMany'] as $has_many_relation) {
-				$renders['hasMany'] = $this->renderHasMany($has_many_relation);
-			}
+        // Render hasMany relations
+        foreach (($relations['hasMany'] ?? []) as $relation) {
+            $renders['hasMany'][] = $this->renderHasMany($relation);
+        }
 
-			foreach($relations['belongsToMany'] as $belongs_to_many_relation) {
-				$renders['belongsToMany'] = $this->renderBelongsToMany($belongs_to_many_relation);
+			// Render belongsToMany (many-to-many) via hasManyThrough pivot relations
+			foreach (($relations['hasManyThrough'] ?? []) as $relation) {
+				$renders['belongsToMany'][] = $this->renderBelongsToMany($relation);
 			}
 			return $renders;
 		}
@@ -133,8 +136,32 @@
 
         // Replace placeholders with actual values
         $string = str_replace(
-            ['{{relationName}}', '{{relatedModel}}', '{{pivotTable}}', '{{foreignPivotKey}}', '{{relatedPivotKey}}'],
-            [$relationName, $relatedModel, $pivotTable, $foreignPivotKey, $relatedPivotKey],
+            ['{{relationName}}', '{{relatedModel}}', '{{columnName}}'],
+            [$relationName, $relatedModel, $columnName],
+            $snippet
+        );
+
+        return $string;
+    }
+
+    /**
+     * Render a hasMany relation.
+     *
+     * @param array $relationship
+     * @return string
+     */
+    protected function renderHasMany($relationship)
+    {
+        $snippet = $this->getSnippet('has_many_relation');
+        // Method name uses camel case for plural relation
+        $relationName = Str::camel($relationship['table']);
+        $relatedModel = $this->getClassName($relationship['table']);
+        $columnName = $relationship['column'];
+
+        // Replace placeholders with actual values
+        $string = str_replace(
+            ['{{relationName}}', '{{relatedModel}}', '{{columnName}}'],
+            [$relationName, $relatedModel, $columnName],
             $snippet
         );
 
@@ -159,4 +186,30 @@
 
         return $string;
     }
+    /**
+     * Get available insertions including model relationships.
+     *
+     * @return array
+     */
+    public function get_available_inserts(): array
+    {
+        // Merge parent insertions (attributes, fillable, etc.)
+        $inserts = parent::get_available_inserts();
+
+        // Gather and render relationships for this model
+        $relations = RelationshipNavigator::getRelations($this->getCurrentTable());
+        $rendered = $this->renderRelations($relations);
+
+        // Build code blocks for each relation type
+        $belongs = !empty($rendered['belongsTo']) ? implode("\n    ", $rendered['belongsTo']) : '';
+        $hasMany = !empty($rendered['hasMany']) ? implode("\n    ", $rendered['hasMany']) : '';
+        $belongsMany = !empty($rendered['belongsToMany']) ? implode("\n    ", $rendered['belongsToMany']) : '';
+
+        // Assign to stub placeholders
+        $inserts['# {{ belongs_to_relationships }}'] = $belongs;
+        $inserts['# {{ has_many_relationships }}'] = $hasMany;
+        $inserts['# {{ has_many_through_relationships }}'] = $belongsMany;
+
+        return $inserts;
+    }
 }