BadMethodCallException: метод не существует - PullRequest
0 голосов
/ 08 октября 2019

Я пытаюсь создать взаимосвязь «многие ко многим» между этим профилем и таблицей доступности, но в моем тесте я получаю вызов неопределенного метода доступности в тесте.

Это функция контроллера

 /**
 * 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 не существует.

1 Ответ

0 голосов
/ 08 октября 2019

Если вы пытаетесь создать Many to Many отношение на Laravel Отношение ко многим.

Вот как вы это делаете. Вам нужно иметь 2 models и 3 migrations.

FIRST

Ваша модель должна выглядеть так:

Модель профиля

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();
});

Примечание: Iиспользуйте availability_profile соглашение об именах в алфавитном порядке

INFO

Вы можете сгенерировать эту миграцию, используя artisan command, например, php artisan make:migration create_availability_profile_table --create=availability_profile

LAST

В вашем контроллере вы можете назначить profile на availability

Контроллер

Предполагая, что вызапись в вашей базе данных.

public function generateAvailability() {
  $profile = Profile::firstOrFail(1);
  $role = Role::firstOrFail(1);

  $profile->availabilities()->attach($role->id);

  dd(profile->availabilities);
}

Примечание: я использую dd (дампd die), чтобы проверить запись

Вы также можете увидеть это ссылка и это

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...