【问题标题】:BadMethodCallException: Method does not existBadMethodCallException:方法不存在
【发布时间】:2019-10-08 08:12:04
【问题描述】:

我正在尝试在此配置文件和可用性表之间创建多对多关系,但在我的测试中,我不断收到关于测试可用性的未定义方法的调用。

这是控制器功能

 /**
 * Creates association between availability and podcast profile
 *
 * @param array $availabilities
 */
private function associateAvailability(array $availabilities)
{
    $this->podcastProfile->availability()->sync(
        array_map(function ($availability) {
            $availabilityModel = Availability::where('availability', '=', $availability)->first();
            return $availabilityModel->id;
        }, $availabilities)
    );
}

这是播客档案模型中的方法

  /**
 * Defines many-to-many relationship between podcasts and availabilities
 */
public function availability(): BelongsToMany
{
    return $this->belongsToMany(
        'App\Models\Availability',
        'podcast_availability',
        'podcast_profile_id',
        'availability_id'
    );
}

这是对方法的测试

/**
 * @test
 */
public function it_should_create_availability_relationship()
{
    $this->handlePostRequestToController();
    $this->assertTrue($this->user->podcastProfile->availability()->exists());
    $this->checkAvailability($this->requestData['availability']);
}

这是插入到测试中的检查可用性方法

/**
 * Check database
 *
 * @param $availabilities
 */
private function checkAvailability($availabilities): void
{
    foreach ($availabilities as $availability) {
        $availabilityModel = Availability::where('availability', '=', $availability)
            ->first();

        $this->assertDatabaseHas('podcast_availability', [
            'podcast_profile_id' => $this->user->podcastProfile->id,
            'availability_id' => $availabilityModel->id
        ]);
    }
}

这是错误

1) Tests\Feature\PodcastProfileControllerTest::it_should_create_availability_relationship

BadMethodCallException:方法 Illuminate\Database\Eloquent\Collection::availability 不存在。

【问题讨论】:

    标签: php laravel api


    【解决方案1】:

    如果您尝试基于Laravel Many to Many Relationship. 建立Many to Many 关系

    这就是你的做法。您需要有 2 个models 和 3 个migrations

    第一

    您的模型应如下所示:

    个人资料模型

    protected $guarded = [];
    
    public function availabilities() {
      return $this->belongsToMany(Availability::class);
    } 
    

    注意:我使用 availabilities,因为它位于 many to many relationship 中,因此它是一个更好的命名约定。

    可用性模型

    protected $guarded = [];
    
    public function profiles() {
      return $this->belongsToMany(Profile::class);
    }
    

    第二次

    你的迁移应该是这样的:

    个人资料迁移

    Schema::create('profiles', function (Blueprint $table) {
      $table->bigIncrements('id');
      ...
      $table->timestamps();
    });
    

    可用性迁移

    Schema::create('availabilities', function (Blueprint $table) {
      $table->bigIncrements('id');
      ...
      $table->timestamps();
    });
    

    可用性和配置文件迁移

    Schema::create('availability_profile', function (Blueprint $table) {
      $table->bigIncrements('id');
      $table->unsignedBigInteger('availability_id');
      $table->unsignedBigInteger('profile_id');
      $table->timestamps();
    });
    

    注意:我按字母顺序使用availability_profile 命名约定

    信息

    您可以使用artisan command 像这样php artisan make:migration create_availability_profile_table --create=availability_profile 生成此迁移

    最后

    在您的控制器中,您可以将profile 分配给availability

    控制器

    假设您的数据库中有记录。

    public function generateAvailability() {
      $profile = Profile::firstOrFail(1);
      $role = Role::firstOrFail(1);
    
      $profile->availabilities()->attach($role->id);
    
      dd(profile->availabilities);
    }
    

    注意:我用dd(dump and die)来查看记录

    你也可以看到这个referencethis

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-24
      • 2019-05-25
      • 1970-01-01
      • 2020-01-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多