【问题标题】:Cannot access eloquent relationship in laravel test在 laravel 测试中无法访问 eloquent 关系
【发布时间】:2017-03-27 10:27:40
【问题描述】:

我在User模型和UserLevel模型中有如下关系。

用户:

public function user_level()
{
    return $this->belongsTo('App\UserLevel');
}

用户级别:

public function users()
{
    return $this->hasMany('App\User');
}

这在 Tinker 中完美运行,如下所示:

但我似乎无法访问 Laravel PHPUnit 测试中的关系。以下die and dump 返回null

class AddUserTest extends TestCase
{
  use DatabaseMigrations;

  /** @test */
  public function super_admin_can_view_add_user_form()
  {
    $super_admin_user = factory(User::class)->create([
      'username' => 'Test User 6',
      'user_level_id' => 7,
    ]);

    dd($super_admin_user->user_level);
  }
}

如果我dd$super_admin_user,它会正确显示创建的用户。我究竟做错了什么?如何访问测试中的 user_level?

【问题讨论】:

    标签: php laravel laravel-5 phpunit laravel-5.4


    【解决方案1】:

    我只能假设,在您的模型工厂中您还创建了相关的模型,所以如果在您的测试中使用:

    $super_admin_user = factory(User::class)->create([
          'username' => 'Test User 6',
          'user_level_id' => 7,
        ]);
    

    它不会起作用,因为。没有 ID 为 7 的 UserLevel。因此,您应该在测试中创建一个,例如:

    $user_level = factory(UserLevel::class)->create();
    $super_admin_user = factory(User::class)->create([
          'username' => 'Test User 6',
          'user_level_id' => $user_level->id,
        ]);
    

    或从测试中完全删除user_level_id

    $super_admin_user = factory(User::class)->create([
      'username' => 'Test User 6',
    ]);
    

    (这是你在修补程序中使用的)

    参考:https://laravel.com/docs/5.4/database-testing#writing-factories - 关系和属性闭包部分

    【讨论】:

      猜你喜欢
      • 2017-02-17
      • 2018-03-11
      • 1970-01-01
      • 2020-07-03
      • 2015-10-13
      • 2015-03-09
      • 1970-01-01
      • 2015-06-27
      • 1970-01-01
      相关资源
      最近更新 更多