【发布时间】:2020-03-05 05:28:29
【问题描述】:
我正在尝试执行 GET 请求以通过 ID /GET 'film/{id}' 等检索特定电影
film_table
--标识
--描述
这是响应的一部分,如果我在电影模型中有多对多关系,如film 模型所示
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();
我正在尝试编写一个 PHPUnit 测试,以确保当通过 id 抓取影片时,它返回 id、description 以及从多对多关系中选择的选项。
这是我已经开始的测试
FilmControllerTest
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'
]);
}
您能否将这些关系包含在工厂中?
FilmFactory
$factory->define(\App\Models\Film::class, function (Faker $faker) {
return [
'id' => $faker->uuid,
'description' => $faker->paragraph
];
});
LanguagesFactory
$factory->define(\App\Models\Language::class, function (Faker $faker){
$langCode = $faker->languageCode;
return [
'code' => $langCode,
'name' => $langCode,
];
});
CategoriesFactory
$factory->define(\App\Models\Category::class, function (Faker $faker){
return [
'main' => $faker->text,
'sub' => $faker->text,
];
});
我能在这方面得到一些帮助吗?
【问题讨论】:
标签: php laravel phpunit eager-loading