Полиморфное отношение «Один ко многим» равно НУЛЮ

#laravel #relationship

Вопрос:

Я работаю над проектом Laravel с поддоменами. Каждая новая компания получает свой собственный поддомен. Каждый клиент, созданный внутри компании, должен получить один и тот же поддомен.

Поскольку возможно, что поддомен со временем изменится, я использую таблицу поддоменов.

Итак , у меня есть три таблицы и модели: Subdomain , Company и Client и следующие правила:

  • Поддомен может иметь несколько организаций (Компания или Клиент).
  • У компании может быть один поддомен
  • У клиента может быть один поддомен

Поэтому я использую полиморфное отношение «Один ко многим».

миграция create_subdomains_table

 Schema::create('subdomains', function (Blueprint $table) {
    $table->id();
    $table->string('name')->unique();
    $table->morphs('organisation');
    $table->timestamps();
});
 

миграция create_companies_table

 Schema::create('companies', function (Blueprint $table) {
    $table->id();
    $table->string('enterprise_number')->unique();
    $table->string('legal_entity_type');
    $table->string('business_name');
    $table->string('phone');
    $table->string('email');
    $table->json('ancestry')->nullable();
    
    $table->bigInteger('subdomain_id')->unsigned()->nullable();
    $table->foreign('subdomain_id')->references('id')->on('subdomains');

    $table->timestamps();
});
 

Модель компании

 public function subdomain() {
    return $this->morphOne(Subdomain::class, 'organisation');
}
 

Модель поддомена

 public function organisation() {
    return $this->morphTo();
}
 

Создать функцию контроллера компании

 // Create subdomain
$subdomain = Subdomain::create([
    'name' => Str::slug($validatedData['business_name'], '-')
]);

// Create company
$company = Company::create([
    'enterprise_number' => $validatedData['enterprise_number'],
    'legal_entity_type' => $validatedData['legal_entity_type'],
    'business_name' => $validatedData['business_name'],
    'phone' => $validatedData['phone'],
    'email' => $validatedData['email'],
]);

// Create relationship between company and subdomain
$company->subdomain()->save($subdomain);
 

Это приводит к ошибке Not null violation: 7 ERROR: null value in column "organisation_type" of relation "subdomains" violates not-null constraint

Хотя я нашел $table->morphs('organisation'); в документации Laravel, я изменил ее на

 $table->bigInteger('organisation_id')->unsigned()->nullable();
$table->string('organisation_type')->nullable();
 

Это работает для создания записи поддомена и компании, но subdomain_id столбец в таблице компаний равен НУЛЮ.

Что я сделал не так?

Комментарии:

1. проблема в ваших ключевых соглашениях

Ответ №1:

‘номер предприятия’ => должен ли идентификатор модели, например: > 1 ,
‘legal_entity_type’ => должно ли пространство имен модели, например: > 'AppModelsModelName' ,