Ошибка фабрики моделей Laravel: попытка получить свойство не-объекта

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

Trying to get property 'id' of non-object

Вот мой код:

// TasksTableSeeder.php

factory(pams\Task::class, '2000', rand(1, 30))->create();

// ModelFactory.php

$factory->defineAs(pams\Task::class, '2000', function (Faker\Generator $faker) {
static $task_number = 01;
return [
    'task_number' => $task_number++,
    'ata_code' => '52-00-00',
    'time_estimate' => $faker->randomFloat($nbMaxDecimals = 2, $min = 0.25, $max = 50),
    'work_order_id' => '2000',
    'description' => $faker->text($maxNbChars = 75),
    'action' => '',
    'duplicate' => '0',
    'certified_by' => '1',
    'certified_date' => '2015-11-08',
    'status' => '1',
    'created_by' => '1',
    'modified_by' => '1',
    'created_at' => Carbon\Carbon::now()->format('Y-m-d H:i:s'),
    'updated_at' => Carbon\Carbon::now()->format('Y-m-d H:i:s'),
    ];
});

Я пытался удалить все переменные из фабрики моделей и использовать константы, но это не помогает. Я попытался извлечь данные из ModelFactory.php и поместить их непосредственно в TasksTableSeeder.php, и это действительно работает, однако я использовал константы, а не переменные.

Я не могу понять, о чем идет речь.

Я использую Laravel v5.1


person Andrew Fox    schedule 28.10.2018    source источник


Ответы (2)


Ваш BaseModel не совсем подходит, так как он заставит вас создавать хаки, чтобы запустить что-то вроде модульного теста. Будет лучше, если у вас есть флаг в BaseModel, который вы проверяете на истинность или ложность перед установкой created_by и modified_by.

Также нет никакой гарантии, что в любой момент времени будет user_id '1', если только вы сначала не создадите User на своей фабрике перед созданием Task.

Способ исправить вашу текущую настройку — иметь защищенное поле, такое как $enableAuthUpdates, для которого по умолчанию установлено значение false или true. Затем вы можете переопределить поле в любой из ваших производных моделей, таких как модель задач, чтобы предотвратить запуск событий создания/обновления.

Также важно убедиться, что у вашей фабрики есть реальный пользователь, с которым она работает, и создать его, если он не существует.

person Chibueze Opata    schedule 07.12.2019

Я нашел проблему. На одном этапе я реализовал модель BaseModel.php, которая автоматически вставляет идентификатор текущего пользователя при создании или обновлении модели. Седер терпит неудачу, потому что нет текущего пользователя, поэтому мне пришлось добавить проверку, чтобы увидеть, был ли пользователь вошел в систему первым.

Вот код:

static::creating(function($model)
    {
        if(Auth::user())
        {
            $model->created_by = Auth::user()->id;
            $model->modified_by = Auth::user()->id;
        }
        else
        {
            $model->created_by = '1';
            $model->modified_by = '1';
        }
    });

    static::updating(function($model)
    {   
        if(Auth::user())
        {
            $model->modified_by = Auth::user()->id;
        }
        else
        {
            $model->modified_by = '1';
        }
    });

Это не супер красиво, но со своей задачей справляется :)

person Andrew Fox    schedule 01.12.2019
comment
Не рекомендуется использовать жестко закодированный идентификатор пользователя в вашей базовой модели. - person beingjungshahi; 07.12.2019