【问题标题】:Laravel Model Factory Error: Trying to get property of non-objectLaravel 模型工厂错误:试图获取非对象的属性
【发布时间】:2019-04-01 09:16:06
【问题描述】:

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

Trying to get property 'id' of non-object

这是我的代码:

//TasksTableSeeder.php

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

//模型工厂.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'。

我正在运行 Laravel v5.1

【问题讨论】:

    标签: laravel-5.1 faker


    【解决方案1】:

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

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

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

    此外,确保您的工厂有一个正在使用的实际用户并在它不存在时创建它也很重要。

    【讨论】:

      【解决方案2】:

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

      它不是超级漂亮,但它可以完成工作:)

      【讨论】:

      • 在基本模型中使用硬编码的用户 ID 不是最佳做法。
      猜你喜欢
      • 2016-06-13
      • 2018-06-02
      • 2017-08-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-03
      相关资源
      最近更新 更多