Laravel模型工厂错误:试图获取非对象的属性



我正试图使用模型工厂来为我的数据库播种,但当我运行它时,我得到了错误:

Trying to get property 'id' of non-object

这是我的代码:

//TasksTableSeeder.php

factory(pamsTask::class, '2000', rand(1, 30))->create();

//ModelFactory.php

$factory->defineAs(pamsTask::class, '2000', function (FakerGenerator $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' => CarbonCarbon::now()->format('Y-m-d H:i:s'),
'updated_at' => CarbonCarbon::now()->format('Y-m-d H:i:s'),
];
});

我试过从模型工厂中删除所有变量并使用常量,但这并不能解决问题。我试过将数据从ModelFactory.php中提取并直接放入TasksTableSeeder.php中,它确实有效,但我使用的是常量而不是变量。

我一辈子都搞不清楚它在说什么。

我正在运行Laravel v5.1

您的BaseModel并不完全合适,因为它会迫使您创建hack以运行类似单元测试的东西。最好在BaseModel中有一个标志,在设置created_bymodified_by之前测试其是否为true或false。

此外,也不能保证在任何时间点都会有user_id'1',除非您在创建Task之前先在工厂中创建该User

修复当前设置的一种方法是有一个受保护的字段,如$enableAuthUpdates,默认情况下设置为false或true。然后,您可以覆盖任何派生模型(如任务模型(中的字段,以阻止创建/更新事件的运行。

同样重要的是要确保你的工厂有一个真正的用户,如果它不存在,就创建它。

我发现了问题。在某个阶段,我实现了一个BaseModel.php模型,该模型在创建或更新模型时自动插入当前用户ID。种子程序失败是因为没有当前用户,所以我必须添加一个检查,看看是否有用户首先登录。

这是代码:

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';
}
});

它不是超级漂亮,但它完成了任务:(

最新更新