如何解决如何在 Laravel 中将 existing_model 作为多对多关系添加到 dummy_mode
我正在尝试在 Laravel 中创建一个测试用例。
-
我有一个假用户模型(它存在于数据库中),并使用
faker->make
创建它, -
以及存在于数据库中的真实角色模型,
这两个有多对多关系
在我的测试用例中,我将像这样关联它们:
public function testAccess()
{
$user = factory(\App\User::class)->make();
$supervisionControllerRole = \App\Role::where('name','supervision_controller')->first();
$user->roles->add($supervisionControllerRole);
}
因为我不想将关系保存在数据库中,所以我使用 add()
而不是 attach()
:
$user->roles()->attach($supervisionControllerRole->id);
//resulting database modification.
问题
我的问题是,当我试图从模型中获取关系时,它没问题。
var_dump($user->roles->first());
但是当我试图获得关系模型内时,它不起作用。
就像在我的 User
模型中一样:
public function hasRole($roleName)
{
$role_id = Cache::tags(['role_id'])->remember($roleName,24*3600,function () use ($roleName) {
return \App\Role::where('name',$roleName)->first()->id;
});
return $this->roles()->where('role_id',$role_id)->exists();
}
它将 returns false
并尝试 $this->roles->count()
结果 0
从模型内部。
我的定义
在 User
模型中:
public function roles()
{
return $this->belongsToMany("App\Role","role_user")->whereNull("deleted_at")->using("App\RoleUser");
}
用户工厂:
$factory->define(User::class,function (Faker $faker) {
return [
'id' => $faker->randomNumber(),'name' => $faker->name,'email' => $faker->unique()->safeEmail,'email_verified_at' => now(),'password' => Str::random(80),// password
'remember_token' => Str::random(10),];
});
解决方法
每当你用括号调用关系时,例如
return $this->roles()->where('role_id',$role_id)->exists();
^^
您正在访问一个 Builder
查询实例,它将从数据库返回信息。但是你的数据不在数据库中,所以当它在那里查找时当然不会找到任何东西。
当您直接 add()
关系(与 attach()
相比)时,您插入的是 Collection
实例,正如您所知,它不会影响数据库。此信息仅保存在模型上并存储在内存中。因此当你这样做时
var_dump($user->roles->first());
它会找到信息,因为它已经在内存中了。 (您还应该能够在此处调用 $user->roles->count()
并获得非零值。)
而且由于它是模型与直接属性的关系,我什至认为如果您要save()
模型,它不会更新数据库。
如果不存储在数据库中,可以使用 contains
方法执行第一步:
return $this->roles->contains($role_id);
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。