Php 拉韦尔急加载脉冲试验
我试图通过idPhp 拉韦尔急加载脉冲试验,php,laravel,phpunit,eager-loading,Php,Laravel,Phpunit,Eager Loading,我试图通过id/GET'film/{id}等执行GET请求以检索特定的电影 胶片表 public function show(string $id): string { /** @var Film $film*/ $film = film::findOrFail($id) ->with( 'languages', 'categories', )->get(); retu
/GET'film/{id}
等执行GET请求以检索特定的电影
胶片表
public function show(string $id): string
{
/** @var Film $film*/
$film = film::findOrFail($id)
->with(
'languages',
'categories',
)->get();
return $film->toJson();
public function setUp(): void
{
parent::setUp();
$this->film = factory(Film::class)->create();
$languages = factory(Language::class)->create();
$categories = factory(Category::class)->create();
}
/**
* @test
*/
public function it_should_get_film()
{
$response = $this->json('GET', '/film/' . $this->film->id);
$film= Film::findOrFail($this->film->id);
$response->assertJson([
'id' => $film->id,
'description' => 'This is my favourite film'
]);
}
$factory->define(\App\Models\Film::class, function (Faker $faker) {
return [
'id' => $faker->uuid,
'description' => $faker->paragraph
];
});
$factory->define(\App\Models\Language::class, function (Faker $faker){
$langCode = $faker->languageCode;
return [
'code' => $langCode,
'name' => $langCode,
];
});
$factory->define(\App\Models\Category::class, function (Faker $faker){
return [
'main' => $faker->text,
'sub' => $faker->text,
];
});
--身份证
--描述
这是响应的一部分,如果我在电影模型中有多对多关系,如电影
模型所示,该怎么办
public function languages(): BelongsToMany
{
return $this->belongsToMany(
'App\Models\Language',
'film_languages',
'film_id',
'language_code'
);
}
public function categories(): BelongsToMany
{
return $this->belongsToMany(
'App\Models\Category',
'film_categories',
'film_id',
'category_id'
);
}
有没有一种方法可以将这些表格作为我在Laravel文档中遇到的一种称为“急切加载”的响应的一部分,但不确定这是否涵盖了我需要的内容我在下面有一个示例,但如果我在正确的轨道上,我就迷失了方向
FilmController
public function show(string $id): string
{
/** @var Film $film*/
$film = film::findOrFail($id)
->with(
'languages',
'categories',
)->get();
return $film->toJson();
public function setUp(): void
{
parent::setUp();
$this->film = factory(Film::class)->create();
$languages = factory(Language::class)->create();
$categories = factory(Category::class)->create();
}
/**
* @test
*/
public function it_should_get_film()
{
$response = $this->json('GET', '/film/' . $this->film->id);
$film= Film::findOrFail($this->film->id);
$response->assertJson([
'id' => $film->id,
'description' => 'This is my favourite film'
]);
}
$factory->define(\App\Models\Film::class, function (Faker $faker) {
return [
'id' => $faker->uuid,
'description' => $faker->paragraph
];
});
$factory->define(\App\Models\Language::class, function (Faker $faker){
$langCode = $faker->languageCode;
return [
'code' => $langCode,
'name' => $langCode,
];
});
$factory->define(\App\Models\Category::class, function (Faker $faker){
return [
'main' => $faker->text,
'sub' => $faker->text,
];
});
我正在尝试编写一个PHPUnit测试,以确保当通过id抓取电影时,它返回id
、description
以及从多对多关系中选择的选项
这是我开始的测试
FilmControllerTest
public function show(string $id): string
{
/** @var Film $film*/
$film = film::findOrFail($id)
->with(
'languages',
'categories',
)->get();
return $film->toJson();
public function setUp(): void
{
parent::setUp();
$this->film = factory(Film::class)->create();
$languages = factory(Language::class)->create();
$categories = factory(Category::class)->create();
}
/**
* @test
*/
public function it_should_get_film()
{
$response = $this->json('GET', '/film/' . $this->film->id);
$film= Film::findOrFail($this->film->id);
$response->assertJson([
'id' => $film->id,
'description' => 'This is my favourite film'
]);
}
$factory->define(\App\Models\Film::class, function (Faker $faker) {
return [
'id' => $faker->uuid,
'description' => $faker->paragraph
];
});
$factory->define(\App\Models\Language::class, function (Faker $faker){
$langCode = $faker->languageCode;
return [
'code' => $langCode,
'name' => $langCode,
];
});
$factory->define(\App\Models\Category::class, function (Faker $faker){
return [
'main' => $faker->text,
'sub' => $faker->text,
];
});
你能将这些关系纳入工厂吗
FilmFactory
public function show(string $id): string
{
/** @var Film $film*/
$film = film::findOrFail($id)
->with(
'languages',
'categories',
)->get();
return $film->toJson();
public function setUp(): void
{
parent::setUp();
$this->film = factory(Film::class)->create();
$languages = factory(Language::class)->create();
$categories = factory(Category::class)->create();
}
/**
* @test
*/
public function it_should_get_film()
{
$response = $this->json('GET', '/film/' . $this->film->id);
$film= Film::findOrFail($this->film->id);
$response->assertJson([
'id' => $film->id,
'description' => 'This is my favourite film'
]);
}
$factory->define(\App\Models\Film::class, function (Faker $faker) {
return [
'id' => $faker->uuid,
'description' => $faker->paragraph
];
});
$factory->define(\App\Models\Language::class, function (Faker $faker){
$langCode = $faker->languageCode;
return [
'code' => $langCode,
'name' => $langCode,
];
});
$factory->define(\App\Models\Category::class, function (Faker $faker){
return [
'main' => $faker->text,
'sub' => $faker->text,
];
});
语言工厂
public function show(string $id): string
{
/** @var Film $film*/
$film = film::findOrFail($id)
->with(
'languages',
'categories',
)->get();
return $film->toJson();
public function setUp(): void
{
parent::setUp();
$this->film = factory(Film::class)->create();
$languages = factory(Language::class)->create();
$categories = factory(Category::class)->create();
}
/**
* @test
*/
public function it_should_get_film()
{
$response = $this->json('GET', '/film/' . $this->film->id);
$film= Film::findOrFail($this->film->id);
$response->assertJson([
'id' => $film->id,
'description' => 'This is my favourite film'
]);
}
$factory->define(\App\Models\Film::class, function (Faker $faker) {
return [
'id' => $faker->uuid,
'description' => $faker->paragraph
];
});
$factory->define(\App\Models\Language::class, function (Faker $faker){
$langCode = $faker->languageCode;
return [
'code' => $langCode,
'name' => $langCode,
];
});
$factory->define(\App\Models\Category::class, function (Faker $faker){
return [
'main' => $faker->text,
'sub' => $faker->text,
];
});
分类工厂
public function show(string $id): string
{
/** @var Film $film*/
$film = film::findOrFail($id)
->with(
'languages',
'categories',
)->get();
return $film->toJson();
public function setUp(): void
{
parent::setUp();
$this->film = factory(Film::class)->create();
$languages = factory(Language::class)->create();
$categories = factory(Category::class)->create();
}
/**
* @test
*/
public function it_should_get_film()
{
$response = $this->json('GET', '/film/' . $this->film->id);
$film= Film::findOrFail($this->film->id);
$response->assertJson([
'id' => $film->id,
'description' => 'This is my favourite film'
]);
}
$factory->define(\App\Models\Film::class, function (Faker $faker) {
return [
'id' => $faker->uuid,
'description' => $faker->paragraph
];
});
$factory->define(\App\Models\Language::class, function (Faker $faker){
$langCode = $faker->languageCode;
return [
'code' => $langCode,
'name' => $langCode,
];
});
$factory->define(\App\Models\Category::class, function (Faker $faker){
return [
'main' => $faker->text,
'sub' => $faker->text,
];
});
我能在这方面得到一些帮助吗?我遇到了麻烦,一些帮助和例子会很好:)谢谢 你的思路非常正确。但是,存在一些语法错误 这就是如何抓取一部电影,并加载所需的关系,然后将其作为JSON返回:
public function show($id)
{
$film = Film::with(['languages', 'categories'])->findOrFail($id);
return $film; // will automatically convert it to JSON
}
这就是你测试它的方法:
public function testShowFilm()
{
$film = factory(Film::class)->create();
$language = factory(Language::class)->create();
$film->languages()->attach($language->id); // associate the film with the language
$category = factory(Category::class)->create();
$film->categories()->attach($category->id); // associate the film with the category
$url = '/films/' . $film->id;
$this->json('GET', $url)
->assertStatus(200)
->assertJsonPath(['id' => $film->id])
->assertJsonPath(['description' => $film->description])
->assertJsonPath(['languages.0.id' => $language->id])
->assertJsonPath(['categories.0.id' => $category->id]);
}
请注意,在您的场景中,您应该:
- 3个模型表:电影、类别、语言李>
- 每个模型表对应一个工厂李>
- 2个关系表:电影类别和电影语言
attach
方法将关系设置为测试的一部分,也可以使用factory回调:
哇,谢谢你,伙计,这帮了大忙,出于好奇,0代表了什么?['languages.0.id'=>$language->id])\n谢谢:D@Bwinnyz它表示收藏中的第一项。假设电影和类别/语言之间存在一对多关系,
::with(['categories',languages'])
将返回各自对象的集合。好的,如果是多对多关系呢?您是否有类别。id
@Bwinnyz,对不起,当然是多对多。但情况也是如此。当你拉一部电影,它将不会有一个单一的类别,而是一个类别的集合(即使该集合可能只包含一个项目)。因此,您无法使用$film->category
访问第一个类别,您需要使用$film->categories[0]
访问它,在上述测试的上下文中,这将转换为类别。0
。好的,很有意义,谢谢您为我清理:)