1, 'name' => '测试宠物', 'grade' => PetGrade::FIRST, 'level' => 1, 'experience' => 0, 'stamina' => 100, 'max_experience' => 100, 'max_stamina' => 100, 'status' => PetStatus::NORMAL, ]); // 验证宠物存在 $this->assertDatabaseHas('kku_pet_users', [ 'id' => $pet->id, 'name' => '测试宠物', 'user_id' => 1, ]); // 软删除宠物 $pet->delete(); // 验证宠物在正常查询中不可见 $this->assertDatabaseMissing('kku_pet_users', [ 'id' => $pet->id, 'name' => '测试宠物', 'user_id' => 1, 'deleted_at' => null, ]); // 验证宠物在软删除表中可见 $this->assertSoftDeleted('kku_pet_users', [ 'id' => $pet->id, 'name' => '测试宠物', 'user_id' => 1, ]); // 验证通过模型查询不到已删除的宠物 $foundPet = PetUser::find($pet->id); $this->assertNull($foundPet); // 验证通过withTrashed可以查询到已删除的宠物 $trashedPet = PetUser::withTrashed()->find($pet->id); $this->assertNotNull($trashedPet); $this->assertTrue($trashedPet->trashed()); // 恢复宠物 $trashedPet->restore(); // 验证宠物恢复后可见 $this->assertDatabaseHas('kku_pet_users', [ 'id' => $pet->id, 'name' => '测试宠物', 'user_id' => 1, 'deleted_at' => null, ]); // 验证通过模型可以查询到恢复的宠物 $restoredPet = PetUser::find($pet->id); $this->assertNotNull($restoredPet); $this->assertFalse($restoredPet->trashed()); } /** * 测试强制删除功能 */ public function test_force_delete(): void { // 创建测试宠物 $pet = PetUser::create([ 'user_id' => 2, 'name' => '测试宠物2', 'grade' => PetGrade::SECOND, 'level' => 5, 'experience' => 50, 'stamina' => 80, 'max_experience' => 200, 'max_stamina' => 100, 'status' => PetStatus::NORMAL, ]); // 软删除宠物 $pet->delete(); // 验证软删除成功 $this->assertSoftDeleted('kku_pet_users', [ 'id' => $pet->id, 'name' => '测试宠物2', 'user_id' => 2, ]); // 强制删除宠物 $pet->forceDelete(); // 验证宠物完全删除 $this->assertDatabaseMissing('kku_pet_users', [ 'id' => $pet->id, 'name' => '测试宠物2', 'user_id' => 2, ]); // 验证即使使用withTrashed也查询不到 $deletedPet = PetUser::withTrashed()->find($pet->id); $this->assertNull($deletedPet); } /** * 测试软删除对关联查询的影响 */ public function test_soft_delete_with_relations(): void { // 创建测试宠物 $pet = PetUser::create([ 'user_id' => 3, 'name' => '测试宠物3', 'grade' => PetGrade::THIRD, 'level' => 10, 'experience' => 100, 'stamina' => 90, 'max_experience' => 300, 'max_stamina' => 100, 'status' => PetStatus::NORMAL, ]); // 验证可以通过用户ID查询到宠物 $userPets = PetUser::where('user_id', 3)->get(); $this->assertCount(1, $userPets); // 软删除宠物 $pet->delete(); // 验证软删除后通过用户ID查询不到宠物 $userPetsAfterDelete = PetUser::where('user_id', 3)->get(); $this->assertCount(0, $userPetsAfterDelete); // 验证使用withTrashed可以查询到 $userPetsWithTrashed = PetUser::withTrashed()->where('user_id', 3)->get(); $this->assertCount(1, $userPetsWithTrashed); } /** * 测试软删除的查询作用域 */ public function test_soft_delete_scopes(): void { // 创建多个测试宠物 $pet1 = PetUser::create([ 'user_id' => 4, 'name' => '正常宠物', 'grade' => PetGrade::FIRST, 'level' => 1, 'experience' => 0, 'stamina' => 100, 'max_experience' => 100, 'max_stamina' => 100, 'status' => PetStatus::NORMAL, ]); $pet2 = PetUser::create([ 'user_id' => 4, 'name' => '将被删除的宠物', 'grade' => PetGrade::SECOND, 'level' => 2, 'experience' => 20, 'stamina' => 90, 'max_experience' => 150, 'max_stamina' => 100, 'status' => PetStatus::NORMAL, ]); // 软删除第二个宠物 $pet2->delete(); // 测试默认查询(不包含已删除) $normalPets = PetUser::where('user_id', 4)->get(); $this->assertCount(1, $normalPets); $this->assertEquals('正常宠物', $normalPets->first()->name); // 测试withTrashed(包含已删除) $allPets = PetUser::withTrashed()->where('user_id', 4)->get(); $this->assertCount(2, $allPets); // 测试onlyTrashed(只查询已删除) $trashedPets = PetUser::onlyTrashed()->where('user_id', 4)->get(); $this->assertCount(1, $trashedPets); $this->assertEquals('将被删除的宠物', $trashedPets->first()->name); } }