Laravel Nova не сохраняет новую модель

Я сталкиваюсь со странной проблемой: Laravel Nova не может сохранить ни одну из моих моделей. Попытка сохранить пользователя при новой установке Nova с использованием созданного по умолчанию ресурса User по-прежнему терпит неудачу. (Тем не менее, обновление записи пользователя работает).

Ошибка, которую я получаю при попытке создать нового пользователя:

No query results for model [App\User].

Заглянув в Laravel Nova Core, за это отвечает файл: vendor/laravel/nova/src/Http/Controllers/ResourceStoreController.php Внутри этой функции, если я попытаюсь вручную сохранить новую модель

dd((new User())->create(['name' => '', 'email' => '', etc]));

он успешно выводит модель, но все еще не сохраняет ее в базе данных.

Тот же код, помещенный в Tinker / любой другой веб-маршрут, успешно создает новую модель и сохраняет ее в БД.

My app\Nova\User.php:

<?php

namespace App\Nova;

use Laravel\Nova\Fields\ID;
use Illuminate\Http\Request;
use Laravel\Nova\Fields\Text;
use Laravel\Nova\Fields\Gravatar;
use Laravel\Nova\Fields\Password;

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

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

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

    /**
     * Get the fields displayed by the resource.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return array
     */
    public function fields(Request $request)
    {
        return [
            ID::make()->sortable(),

            Gravatar::make(),

            Text::make('Name')
                ->sortable()
                ->rules('required', 'max:255'),

            Text::make('Email')
                ->sortable()
                ->rules('required', 'email', 'max:254')
                ->creationRules('unique:users,email')
                ->updateRules('unique:users,email,{{resourceId}}'),

            Password::make('Password')
                ->onlyOnForms()
                ->creationRules('required', 'string', 'min:8')
                ->updateRules('nullable', 'string', 'min:8'),
        ];
    }

    /**
     * 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 [];
    }
}

Модель пользователя:

<?php

namespace App;

use Illuminate\Contracts\Auth\MustVerifyEmail;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;

class User extends Authenticatable
{
    use Notifiable;

    /**
     * The attributes that are mass assignable.
     *
     * @var array
     */
    protected $fillable = [
        'name', 'email', 'password',
    ];

    /**
     * The attributes that should be hidden for arrays.
     *
     * @var array
     */
    protected $hidden = [
        'password', 'remember_token',
    ];

    /**
     * The attributes that should be cast to native types.
     *
     * @var array
     */
    protected $casts = [
        'email_verified_at' => 'datetime',
    ];
}

Перенос моей таблицы пользователей

<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

class CreateUsersTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('users', function (Blueprint $table) {
            $table->bigIncrements('id');
            $table->string('name');
            $table->string('email')->unique();
            $table->timestamp('email_verified_at')->nullable();
            $table->string('password');
            $table->rememberToken();
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('users');
    }
}

Есть идеи, что может таким образом помешать операции сохранения? Для получения дополнительной информации моя установка выглядит следующим образом:

Laravel (5.8) Nova (2.5) PHP 7.2 MySQL версии 15.1 Distrib 10.4.6-MariaDB


person Chiko    schedule 20.10.2019    source источник


Ответы (2)


Оказалось, проблема была в моей установке MariaDB. Недавно обновив его, я предполагаю, что какая-то конфигурация вызвала хаос. Переход с MariaDB на MySQL 8 решил проблему.

person Chiko    schedule 20.10.2019
comment
Вы определили, какая функция нужна или отличается в двух версиях базы данных? Это может быть удобно (1) разработчикам Laravel и (2) другим пользователям. - person Rick James; 21.10.2019
comment
Спасибо, @RickJames, и, к сожалению, я не смог этого определить. Недавно изменившись с mysql 5 на mariadb 10, я думаю, что были некоторые конфликты, которые я не разрешил должным образом во время этого переключения, отсюда и ошибка. Это мое сильное подозрение. - person Chiko; 22.10.2019

Не инициализируйте новый класс модели при использовании массового назначения, вызовите статический метод ::create()

\App\User::create(['name' => '', 'email' => '', etc]);

Также убедитесь, что все свойства заполняются в модели User.

protected $fillable = [
    'name', 'email', 'password', // Add the rest
];

или ты можешь делать то, что делаю я

protected $guarded = []; // yolo

Надеюсь это поможет

person Salim Djerbouh    schedule 20.10.2019
comment
Спасибо, но не повезло с обоими методами :( - person Chiko; 20.10.2019
comment
Опубликуйте свой app/Nova/User.php класс, чтобы я мог воспроизвести это - person Salim Djerbouh; 20.10.2019
comment
Ваш ресурс nova выглядит нормально, возможно, ошибка связана с моделью пользователя или миграцией таблицы пользователей, добавьте их в вопрос - person Salim Djerbouh; 20.10.2019
comment
Выполнено. Пожалуйста, имейте в виду, что это в основном новая установка с установленным Laravel Nova, поэтому я ничего не настраивал. Создал этот свежий экземпляр после того, как испытал то же самое на более зрелой кодовой базе, с которой работал. - person Chiko; 20.10.2019
comment
Все в порядке (а где ваш User::create код?), Я не могу воспроизвести это, так что это определенно ошибка в Nova, попробуйте загрузить новую версию, так как вы могли повредить файл в каталоге / nova - person Salim Djerbouh; 20.10.2019