Mercurial > packages > magicforger
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; + } }
