laravel / nova-issues

553 stars 34 forks source link

Meta is always altered to Metum #918

Closed MadMikeyB closed 5 years ago

MadMikeyB commented 5 years ago

Description:

Meta in a Model Name is always altered (singularised or pluralised) to Metum. ProductMetum, PostMetum, ImageMetum. Affecting HasMany and HasOne relationships (that I've tested).

Steps To Reproduce:

Make the Model and Migration for Product:

php artisan make:model Models\\Product -m

App\Models\Product.php

<?php

namespace App\Models;

use App\Primitives\Money;
use Laravel\Nova\Actions\Actionable;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\SoftDeletes;

class Product extends Model
{
    use Actionable, SoftDeletes;

     /**
     * @var array The properties guarded from mass assignment
     */   
    public $guarded = ['id'];

    /**
     * The attributes that should be cast to carbon instances.
     *
     * @var array
     */
    protected $dates = ['deleted_at', 'published_at'];

    /**
     * Boot the Product Model.
     */
    protected static function boot()
    {
        parent::boot();
    }

    /**
     * A product has many meta fields
     *
     * @return \Illuminate\Database\Eloquent\Relations\HasMany
     */
    public function metas()
    {
        return $this->hasMany(ProductMeta::class);
    }
}

create_products_table.php

    public function up()
    {
        Schema::create('products', function (Blueprint $table) {
            $table->increments('id');
            $table->string('title');
            $table->string('slug');
            $table->string('sku');
            $table->integer('price');
            $table->text('body');
            $table->integer('category_id')->nullable();
            $table->tinyInteger('active')->default(1);
            $table->softDeletes();
            $table->timestamp('published_at')->nullable();
            $table->timestamps();
        });
    }

Make the Model and Migration for Product Meta

php artisan make:model Models\\ProductMeta -m

app\Models\ProductMeta.php

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\SoftDeletes;

class ProductMeta extends Model
{
    use SoftDeletes;

     /**
     * @var array The properties guarded from mass assignment
     */   
    public $guarded = ['id'];

    /**
     * The attributes that should be cast to carbon instances.
     *
     * @var array
     */
    protected $dates = ['deleted_at'];

    /**
     * Boot the ProductMeta Model.
     */
    protected static function boot()
    {
        parent::boot();
    }

    /**
     * A product meta belongs to a product
     *
     * @return \Illuminate\Database\Eloquent\Relations\BelongsTo
     */
    public function product()
    {
        return $this->belongsTo(Product::class);
    }
}

Make the resources: php artisan nova:resource Product

<?php

namespace App\Nova;

use Laravel\Nova\Fields\ID;
use Illuminate\Http\Request;
use Laravel\Nova\Fields\Text;
use Laravel\Nova\Fields\Trix;
use App\Nova\Actions\MakeActive;
use Laravel\Nova\Fields\Boolean;
use Laravel\Nova\Fields\HasMany;
use Laravel\Nova\Fields\DateTime;
use App\Nova\Actions\MakeFeatured;
use Laravel\Nova\Fields\BelongsTo;
use Laravel\Nova\Fields\MorphMany;
use Benjaminhirsch\NovaSlugField\Slug;
use Benjaminhirsch\NovaSlugField\TextWithSlug;

class Product extends Resource
{
    /**
     * The model the resource corresponds to.
     *
     * @var string
     */
    public static $model = 'App\\Models\\Product';

    /**
     * The single value that should be used to represent the resource when being displayed.
     *
     * @var string
     */
    public static $title = 'title';

    /**
     * The logical group associated with the resource.
     *
     * @var string
     */
    public static $group = 'Content';

    /**
     * The columns that should be searched.
     *
     * @var array
     */
    public static $search = [
        'id', 'title'
    ];

    /**
     * Get the fields displayed by the resource.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return array
     */
    public function fields(Request $request)
    {
        return [
            ID::make()->sortable(),
            TextWithSlug::make('Title')->sortable()->slug('Slug')->rules('required'),
            Slug::make('Slug')->rules('required')->hideFromIndex(),
            Slug::make('Sku')->rules('required')->hideFromIndex(),
            BelongsTo::make('Category')->rules('required')->sortable(),
            Trix::make('Body')->rules('required'),
            Text::make('Price')->rules('required'),
            Boolean::make('Active')->sortable(),
            Boolean::make('Show on Homepage', 'featured')->sortable(),
            DateTime::make('Published At')->hideFromIndex(),
            MorphMany::make('Images'),
            HasMany::make('ProductMeta')
        ];
    }

    /**
     * Get the cards available for the request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return array
     */
    public function cards(Request $request)
    {
        return [];
    }

    /**
     * Get the filters available for the resource.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return array
     */
    public function filters(Request $request)
    {
        return [];
    }

    /**
     * Get the lenses available for the resource.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return array
     */
    public function lenses(Request $request)
    {
        return [];
    }

    /**
     * Get the actions available for the resource.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return array
     */
    public function actions(Request $request)
    {
        return [
            new MakeFeatured,
            new MakeActive
        ];
    }
}

php artisan nova:resource ProductMeta

<?php

namespace App\Nova;

use Laravel\Nova\Fields\ID;
use Illuminate\Http\Request;
use Laravel\Nova\Fields\Textarea;
use Laravel\Nova\Fields\BelongsTo;
use Benjaminhirsch\NovaSlugField\Slug;

class ProductMeta extends Resource
{
    /**
     * The model the resource corresponds to.
     *
     * @var string
     */
    public static $model = 'App\\Models\\ProductMeta';

    /**
     * The single value that should be used to represent the resource when being displayed.
     *
     * @var string
     */
    public static $title = 'id';

    /**
     * The logical group associated with the resource.
     *
     * @var string
     */
    public static $group = 'Content';

    /**
     * The columns that should be searched.
     *
     * @var array
     */
    public static $search = [];

    /**
     * Get the fields displayed by the resource.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return array
     */
    public function fields(Request $request)
    {
        return [
            ID::make()->sortable(),
            Slug::make('Key')->rules('required'),
            Textarea::make('Value')->rules('required'),
            BelongsTo::make('Product'),
        ];
    }

    /**
     * Get the cards available for the request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return array
     */
    public function cards(Request $request)
    {
        return [];
    }

    /**
     * Get the filters available for the resource.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return array
     */
    public function filters(Request $request)
    {
        return [];
    }

    /**
     * Get the lenses available for the resource.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return array
     */
    public function lenses(Request $request)
    {
        return [];
    }

    /**
     * Get the actions available for the resource.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return array
     */
    public function actions(Request $request)
    {
        return [];
    }

    /**
     * Get the displayble label of the resource.
     *
     * @return string
     */
    // public static function label()
    // {
    //     return __('Product Meta');
    // }
}

screen shot 2018-10-31 at 18 33 40

Full Stack Trace of error:

[2018-10-31 18:33:38] local.ERROR: Class 'App\Nova\ProductMetum' not found {"userId":1,"email":"me@mikeylicio.us","exception":"[object] (Symfony\\Component\\Debug\\Exception\\FatalThrowableError(code: 0): Class 'App\\Nova\\ProductMetum' not found at /Users/mikey/sites/developmental.site/nova/src/Fields/HasMany.php:61)
[stacktrace]
#0 /Users/mikey/sites/developmental.site/nova/src/Element.php(59): Laravel\\Nova\\Fields\\HasMany->__construct('ProductMeta')
#1 /Users/mikey/sites/developmental.site/app/Nova/Product.php(71): Laravel\\Nova\\Element::make('ProductMeta')
#2 /Users/mikey/sites/developmental.site/nova/src/ResolvesFields.php(267): App\\Nova\\Product->fields(Object(Laravel\\Nova\\Http\\Requests\\ResourceIndexRequest))
#3 /Users/mikey/sites/developmental.site/nova/src/ResolvesFields.php(163): Laravel\\Nova\\Resource->availableFields(Object(Laravel\\Nova\\Http\\Requests\\ResourceIndexRequest))
#4 /Users/mikey/sites/developmental.site/nova/src/ResolvesFields.php(30): Laravel\\Nova\\Resource->resolveFields(Object(Laravel\\Nova\\Http\\Requests\\ResourceIndexRequest))
#5 /Users/mikey/sites/developmental.site/nova/src/Resource.php(285): Laravel\\Nova\\Resource->indexFields(Object(Laravel\\Nova\\Http\\Requests\\ResourceIndexRequest))
#6 /Users/mikey/sites/developmental.site/vendor/laravel/framework/src/Illuminate/Support/HigherOrderCollectionProxy.php(60): Laravel\\Nova\\Resource->serializeForIndex(Object(Laravel\\Nova\\Http\\Requests\\ResourceIndexRequest))
#7 [internal function]: Illuminate\\Support\\HigherOrderCollectionProxy->Illuminate\\Support\\{closure}(Object(App\\Nova\\Product), 0)
#8 /Users/mikey/sites/developmental.site/vendor/laravel/framework/src/Illuminate/Support/Collection.php(946): array_map(Object(Closure), Array, Array)
#9 /Users/mikey/sites/developmental.site/vendor/laravel/framework/src/Illuminate/Support/HigherOrderCollectionProxy.php(61): Illuminate\\Support\\Collection->map(Object(Closure))
#10 /Users/mikey/sites/developmental.site/nova/src/Http/Controllers/ResourceIndexController.php(24): Illuminate\\Support\\HigherOrderCollectionProxy->__call('serializeForInd...', Array)
#11 [internal function]: Laravel\\Nova\\Http\\Controllers\\ResourceIndexController->handle(Object(Laravel\\Nova\\Http\\Requests\\ResourceIndexRequest), 'products')
#12 /Users/mikey/sites/developmental.site/vendor/laravel/framework/src/Illuminate/Routing/Controller.php(54): call_user_func_array(Array, Array)
#13 /Users/mikey/sites/developmental.site/vendor/laravel/framework/src/Illuminate/Routing/ControllerDispatcher.php(45): Illuminate\\Routing\\Controller->callAction('handle', Array)
#14 /Users/mikey/sites/developmental.site/vendor/laravel/framework/src/Illuminate/Routing/Route.php(212): Illuminate\\Routing\\ControllerDispatcher->dispatch(Object(Illuminate\\Routing\\Route), Object(Laravel\\Nova\\Http\\Controllers\\ResourceIndexController), 'handle')
#15 /Users/mikey/sites/developmental.site/vendor/laravel/framework/src/Illuminate/Routing/Route.php(169): Illuminate\\Routing\\Route->runController()
#16 /Users/mikey/sites/developmental.site/vendor/laravel/framework/src/Illuminate/Routing/Router.php(679): Illuminate\\Routing\\Route->run()
#17 /Users/mikey/sites/developmental.site/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php(30): Illuminate\\Routing\\Router->Illuminate\\Routing\\{closure}(Object(Illuminate\\Http\\Request))
#18 /Users/mikey/sites/developmental.site/nova/src/Http/Middleware/Authorize.php(18): Illuminate\\Routing\\Pipeline->Illuminate\\Routing\\{closure}(Object(Illuminate\\Http\\Request))
#19 /Users/mikey/sites/developmental.site/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(151): Laravel\\Nova\\Http\\Middleware\\Authorize->handle(Object(Illuminate\\Http\\Request), Object(Closure))
#20 /Users/mikey/sites/developmental.site/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php(53): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request))
#21 /Users/mikey/sites/developmental.site/nova/src/Http/Middleware/BootTools.php(20): Illuminate\\Routing\\Pipeline->Illuminate\\Routing\\{closure}(Object(Illuminate\\Http\\Request))
#22 /Users/mikey/sites/developmental.site/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(151): Laravel\\Nova\\Http\\Middleware\\BootTools->handle(Object(Illuminate\\Http\\Request), Object(Closure))
#23 /Users/mikey/sites/developmental.site/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php(53): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request))
#24 /Users/mikey/sites/developmental.site/nova/src/Http/Middleware/DispatchServingNovaEvent.php(20): Illuminate\\Routing\\Pipeline->Illuminate\\Routing\\{closure}(Object(Illuminate\\Http\\Request))
#25 /Users/mikey/sites/developmental.site/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(151): Laravel\\Nova\\Http\\Middleware\\DispatchServingNovaEvent->handle(Object(Illuminate\\Http\\Request), Object(Closure))
#26 /Users/mikey/sites/developmental.site/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php(53): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request))
#27 /Users/mikey/sites/developmental.site/vendor/laravel/framework/src/Illuminate/Auth/Middleware/Authenticate.php(43): Illuminate\\Routing\\Pipeline->Illuminate\\Routing\\{closure}(Object(Illuminate\\Http\\Request))
#28 /Users/mikey/sites/developmental.site/nova/src/Http/Middleware/Authenticate.php(31): Illuminate\\Auth\\Middleware\\Authenticate->handle(Object(Illuminate\\Http\\Request), Object(Closure))
#29 /Users/mikey/sites/developmental.site/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(151): Laravel\\Nova\\Http\\Middleware\\Authenticate->handle(Object(Illuminate\\Http\\Request), Object(Closure))
#30 /Users/mikey/sites/developmental.site/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php(53): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request))
#31 /Users/mikey/sites/developmental.site/vendor/laravel/framework/src/Illuminate/Routing/Middleware/SubstituteBindings.php(41): Illuminate\\Routing\\Pipeline->Illuminate\\Routing\\{closure}(Object(Illuminate\\Http\\Request))
#32 /Users/mikey/sites/developmental.site/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(151): Illuminate\\Routing\\Middleware\\SubstituteBindings->handle(Object(Illuminate\\Http\\Request), Object(Closure))
#33 /Users/mikey/sites/developmental.site/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php(53): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request))
#34 /Users/mikey/sites/developmental.site/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/VerifyCsrfToken.php(75): Illuminate\\Routing\\Pipeline->Illuminate\\Routing\\{closure}(Object(Illuminate\\Http\\Request))
#35 /Users/mikey/sites/developmental.site/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(151): Illuminate\\Foundation\\Http\\Middleware\\VerifyCsrfToken->handle(Object(Illuminate\\Http\\Request), Object(Closure))
#36 /Users/mikey/sites/developmental.site/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php(53): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request))
#37 /Users/mikey/sites/developmental.site/vendor/laravel/framework/src/Illuminate/View/Middleware/ShareErrorsFromSession.php(49): Illuminate\\Routing\\Pipeline->Illuminate\\Routing\\{closure}(Object(Illuminate\\Http\\Request))
#38 /Users/mikey/sites/developmental.site/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(151): Illuminate\\View\\Middleware\\ShareErrorsFromSession->handle(Object(Illuminate\\Http\\Request), Object(Closure))
#39 /Users/mikey/sites/developmental.site/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php(53): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request))
#40 /Users/mikey/sites/developmental.site/vendor/laravel/framework/src/Illuminate/Session/Middleware/StartSession.php(63): Illuminate\\Routing\\Pipeline->Illuminate\\Routing\\{closure}(Object(Illuminate\\Http\\Request))
#41 /Users/mikey/sites/developmental.site/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(151): Illuminate\\Session\\Middleware\\StartSession->handle(Object(Illuminate\\Http\\Request), Object(Closure))
#42 /Users/mikey/sites/developmental.site/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php(53): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request))
#43 /Users/mikey/sites/developmental.site/vendor/laravel/framework/src/Illuminate/Cookie/Middleware/AddQueuedCookiesToResponse.php(37): Illuminate\\Routing\\Pipeline->Illuminate\\Routing\\{closure}(Object(Illuminate\\Http\\Request))
#44 /Users/mikey/sites/developmental.site/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(151): Illuminate\\Cookie\\Middleware\\AddQueuedCookiesToResponse->handle(Object(Illuminate\\Http\\Request), Object(Closure))
#45 /Users/mikey/sites/developmental.site/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php(53): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request))
#46 /Users/mikey/sites/developmental.site/vendor/laravel/framework/src/Illuminate/Cookie/Middleware/EncryptCookies.php(66): Illuminate\\Routing\\Pipeline->Illuminate\\Routing\\{closure}(Object(Illuminate\\Http\\Request))
#47 /Users/mikey/sites/developmental.site/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(151): Illuminate\\Cookie\\Middleware\\EncryptCookies->handle(Object(Illuminate\\Http\\Request), Object(Closure))
#48 /Users/mikey/sites/developmental.site/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php(53): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request))
#49 /Users/mikey/sites/developmental.site/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(104): Illuminate\\Routing\\Pipeline->Illuminate\\Routing\\{closure}(Object(Illuminate\\Http\\Request))
#50 /Users/mikey/sites/developmental.site/vendor/laravel/framework/src/Illuminate/Routing/Router.php(681): Illuminate\\Pipeline\\Pipeline->then(Object(Closure))
#51 /Users/mikey/sites/developmental.site/vendor/laravel/framework/src/Illuminate/Routing/Router.php(656): Illuminate\\Routing\\Router->runRouteWithinStack(Object(Illuminate\\Routing\\Route), Object(Illuminate\\Http\\Request))
#52 /Users/mikey/sites/developmental.site/vendor/laravel/framework/src/Illuminate/Routing/Router.php(622): Illuminate\\Routing\\Router->runRoute(Object(Illuminate\\Http\\Request), Object(Illuminate\\Routing\\Route))
#53 /Users/mikey/sites/developmental.site/vendor/laravel/framework/src/Illuminate/Routing/Router.php(611): Illuminate\\Routing\\Router->dispatchToRoute(Object(Illuminate\\Http\\Request))
#54 /Users/mikey/sites/developmental.site/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(176): Illuminate\\Routing\\Router->dispatch(Object(Illuminate\\Http\\Request))
#55 /Users/mikey/sites/developmental.site/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php(30): Illuminate\\Foundation\\Http\\Kernel->Illuminate\\Foundation\\Http\\{closure}(Object(Illuminate\\Http\\Request))
#56 /Users/mikey/sites/developmental.site/nova/src/Http/Middleware/ServeNova.php(26): Illuminate\\Routing\\Pipeline->Illuminate\\Routing\\{closure}(Object(Illuminate\\Http\\Request))
#57 /Users/mikey/sites/developmental.site/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(151): Laravel\\Nova\\Http\\Middleware\\ServeNova->handle(Object(Illuminate\\Http\\Request), Object(Closure))
#58 /Users/mikey/sites/developmental.site/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php(53): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request))
#59 /Users/mikey/sites/developmental.site/vendor/fideloper/proxy/src/TrustProxies.php(57): Illuminate\\Routing\\Pipeline->Illuminate\\Routing\\{closure}(Object(Illuminate\\Http\\Request))
#60 /Users/mikey/sites/developmental.site/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(151): Fideloper\\Proxy\\TrustProxies->handle(Object(Illuminate\\Http\\Request), Object(Closure))
#61 /Users/mikey/sites/developmental.site/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php(53): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request))
#62 /Users/mikey/sites/developmental.site/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TransformsRequest.php(31): Illuminate\\Routing\\Pipeline->Illuminate\\Routing\\{closure}(Object(Illuminate\\Http\\Request))
#63 /Users/mikey/sites/developmental.site/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(151): Illuminate\\Foundation\\Http\\Middleware\\TransformsRequest->handle(Object(Illuminate\\Http\\Request), Object(Closure))
#64 /Users/mikey/sites/developmental.site/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php(53): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request))
#65 /Users/mikey/sites/developmental.site/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TransformsRequest.php(31): Illuminate\\Routing\\Pipeline->Illuminate\\Routing\\{closure}(Object(Illuminate\\Http\\Request))
#66 /Users/mikey/sites/developmental.site/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(151): Illuminate\\Foundation\\Http\\Middleware\\TransformsRequest->handle(Object(Illuminate\\Http\\Request), Object(Closure))
#67 /Users/mikey/sites/developmental.site/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php(53): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request))
#68 /Users/mikey/sites/developmental.site/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/ValidatePostSize.php(27): Illuminate\\Routing\\Pipeline->Illuminate\\Routing\\{closure}(Object(Illuminate\\Http\\Request))
#69 /Users/mikey/sites/developmental.site/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(151): Illuminate\\Foundation\\Http\\Middleware\\ValidatePostSize->handle(Object(Illuminate\\Http\\Request), Object(Closure))
#70 /Users/mikey/sites/developmental.site/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php(53): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request))
#71 /Users/mikey/sites/developmental.site/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/CheckForMaintenanceMode.php(62): Illuminate\\Routing\\Pipeline->Illuminate\\Routing\\{closure}(Object(Illuminate\\Http\\Request))
#72 /Users/mikey/sites/developmental.site/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(151): Illuminate\\Foundation\\Http\\Middleware\\CheckForMaintenanceMode->handle(Object(Illuminate\\Http\\Request), Object(Closure))
#73 /Users/mikey/sites/developmental.site/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php(53): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request))
#74 /Users/mikey/sites/developmental.site/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(104): Illuminate\\Routing\\Pipeline->Illuminate\\Routing\\{closure}(Object(Illuminate\\Http\\Request))
#75 /Users/mikey/sites/developmental.site/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(151): Illuminate\\Pipeline\\Pipeline->then(Object(Closure))
#76 /Users/mikey/sites/developmental.site/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(116): Illuminate\\Foundation\\Http\\Kernel->sendRequestThroughRouter(Object(Illuminate\\Http\\Request))
#77 /Users/mikey/sites/developmental.site/public/index.php(55): Illuminate\\Foundation\\Http\\Kernel->handle(Object(Illuminate\\Http\\Request))
#78 /Users/mikey/.composer/vendor/weprovide/valet-plus/server.php(117): require('/Users/mikey/si...')
#79 {main}
"} 
MadMikeyB commented 5 years ago

Seems that the Str::singular($name) in nova/src/Fields/ResourceRelationshipGuesser.php is causing Meta to be changed to Metum.

MadMikeyB commented 5 years ago

I am unsure why it is having to use ResourceRelationshipGuesser at all though?

MadMikeyB commented 5 years ago

Updating to Nova 1.1.7 and Laravel 5.7.12 has not fixed this issue.

MadMikeyB commented 5 years ago

Update:

After reading the Nova source I have discovered that I can get around this by doing the following in my fields() method's return array for my Product resource:

HasMany::make('ProductMeta', 'metas', ProductMeta::class)

So I have to explicitly pass the relationship method name from the model as the second attribute, and the Nova Resource name as the third attribute.

Full example of the fields() method app\Nova\Product.php below:

    /**
     * Get the fields displayed by the resource.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return array
     */
    public function fields(Request $request)
    {
        return [
            ID::make()->sortable(),
            TextWithSlug::make('Title')->sortable()->slug('Slug')->rules('required'),
            Slug::make('Slug')->rules('required')->hideFromIndex(),
            Slug::make('Sku')->rules('required')->hideFromIndex(),
            BelongsTo::make('Category')->rules('required')->sortable(),
            Trix::make('Body')->rules('required'),
            Text::make('Price')->rules('required'),
            Boolean::make('Active')->sortable(),
            Boolean::make('Show on Homepage', 'featured')->sortable(),
            DateTime::make('Published At')->hideFromIndex(),
            MorphMany::make('Images'),
            HasMany::make('ProductMeta', 'metas', ProductMeta::class)
        ];
    }

I would still consider this a bug with Nova however, and how it tries to magically figure out the singular/plural of a Model.

thomasjohnkane commented 5 years ago

Thanks @MadMikeyB. I was just looking into this for using Nova with Corcel. I'm going to give this a shot.

davidhemphill commented 5 years ago

This would be an upstream problem with Laravel itself. Consider raising an issue there so it can be fixed here in Nova land. 😄

MadMikeyB commented 5 years ago

@davidhemphill thanks for the reply. I am worried that the way I have worked around the issue is the 'correct' method for dealing with these kinds of issue, and that to 'fix' it in Laravel-land would require a large amount of work for Taylor and co.

My workaround seems to be working fine and I am fine with it, the only problem is that my label() method does not affect the "Create XXX" buttons. It would be great if when I specify a label() method that the buttons within the UI use this specified text rather than the "guessed" plural / singular form of the term.

Would you prefer this as a separate issue?

davidhemphill commented 5 years ago

Glad you got it sorted. You can use the singularLabel method for the button issue, right?

MadMikeyB commented 5 years ago

Of course, thank you for pointing that out!