Laravel Model Factory Error: Trying to get property of non-object

Laravel Model Factory Error: Trying to get property of non-object

我正在尝试使用模型工厂为我的数据库播种,但是当我 运行 它时,我收到错误:

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 并且它确实有效,但是我使用的是常量而不是变量。

我一辈子都搞不懂'id'它在说什么。

我是 运行ning Laravel v5.1

我发现了问题。在某个阶段,我实现了一个 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';
        }
    });

它不是很漂亮,但它完成了工作:)

您的 BaseModel 并不完全合适,因为它会迫使您创建 hack 以 运行 诸如单元测试之类的东西。最好在 BaseModel 中有一个标志,在设置 created_bymodified_by.

之前测试 true 或 false

也不能保证在任何时间点都会有 user_id“1”,除非您在创建 Task 之前先在工厂中实际创建 User

修复当前设置的一种方法是使用 $enableAuthUpdates 之类的受保护字段,默认设置为 false 或 true。然后,您可以覆盖任何派生模型中的字段,例如您的任务模型,以防止 creating/updating 事件来自 运行ning.

同样重要的是要确保您的工厂有一个正在与之合作的实际用户,如果不存在则创建它。