fumeapp / modeltyper

Generate TypeScript interfaces from Laravel Models
MIT License
135 stars 16 forks source link

[BUG] Accessor method for parent_id on model App\Modules\ProductCatalog\Models\Category does not exist #55

Open fbarrento opened 1 year ago

fbarrento commented 1 year ago

What happened?

When running vendor/bin/sail artisan model:typer --plurals --api-resources modeltyper return this error:

 Exception 

  Accessor method for parent_id on model App\Modules\ProductCatalog\Models\Category does not exist

  at vendor/fumeapp/modeltyper/src/Actions/DetermineAccessorType.php:38
     34▕             return $reflectionModel->getMethod($method);
     35▕         } catch (Exception $e) {
     36▕         }
     37▕ 
  ➜  38▕         throw new Exception('Accessor method for ' . $mutator . ' on model ' . $reflectionModel->getName() . ' does not exist');
     39▕     }
     40▕ }
     41▕ 

      +21 vendor frames 

  22  artisan:35
      Illuminate\Foundation\Console\Kernel::handle()

I'm using NestedSet Package to manage the categories.

And applying the trait on the categories model.

<?php

namespace App\Modules\ProductCatalog\Models;

use Kalnoy\Nestedset\NodeTrait;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Database\Eloquent\Relations\HasMany;

class Category extends Model
{
    use HasFactory;
    use NodeTrait;

    public $level;

    public $fillable = [
        'name',
        'slug',
        'parent_id',
        'description'
    ];

    public function products(): HasMany
    {
        return $this->hasMany(Product::class);
    }

}

Environment: laravel: 10 database: postgres

Expected Behavior

The expected behavior is the output of TypeScript interfaces declarations on the console.

Steps To Reproduce

  1. run vendor/bin/sail artisan model:typer --plurals --api-resources
  2. View error
tcampbPPU commented 1 year ago

This exception is supposed to throw when it cannot determine either accessors/mutator method, think like

public function getParentAttribute(): ?self
{
    return $this->where('id', $this->parent_id)->first();
}

or

protected function parent(): Attribute
{
    return Attribute::make(
        get: fn() => $this->where('id', $this->parent_id)->first();
    );
}

Which in your case looks like its coming from that NodeTrait so I would have to see whats all in that trait. When you run the Laravel Model Show command what is the output for this model?

github-actions[bot] commented 1 year ago

This issue is stale because it has been open 30 days with no activity. Remove stale label or comment or this will be closed in 5 days.