Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/281.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 拉韦尔急加载脉冲试验_Php_Laravel_Phpunit_Eager Loading - Fatal编程技术网

Php 拉韦尔急加载脉冲试验

Php 拉韦尔急加载脉冲试验,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

我试图通过id
/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
。好的,很有意义,谢谢您为我清理:)