recherche

Maison  >  Questions et réponses  >  le corps du texte

Schéma de base de données Laravel, clés étrangères nullables

J'ai ces deux tables de base de données :

  1. Tableau des utilisateurs
  2. Liste des partenaires

Table utilisateur gérera ces informations

Schema::create('users', function (Blueprint $table) {
      $table->increments('id')->unique();
      $table->string('email')->unique();
      $table->string('username')->unique();
      $table->string('password', 60);
      $table->string('photo')->nullable();
      $table->integer('partner_id')->unsigned();
      $table->foreign('partner_id')->references('id')->on('partners');
      $table->rememberToken();
      $table->timestamps();
});

Et la Table des partenaires contiendra toutes les méta-informations de l'utilisateur comme le prénom et le nom, etc.

Schema::create('partners', function (Blueprint $table) {

    /**
     * Identity Columns
     */
    $table->increments('id')->unique();
    $table->string('first_name');
    $table->string('middle_name')->nullable();
    $table->string('last_name')->nullable();
    $table->string('display_name')->nullable();
    $table->string('email')->unique()->nullable();
    $table->string('website')->nullable();
    $table->string('phone')->nullable();
    $table->string('mobile')->nullable();
    $table->string('fax')->nullable();
    $table->date('birthdate')->nullable();
    $table->longText('bio')->nullable();
    $table->string('lang')->nullable(); //Language

    /**
     * Address Columns
     */
    $table->text('street')->nullable();
    $table->text('street2')->nullable();
    $table->integer('country_id')->unsigned(); // foreign
    $table->foreign('country_id')->references('id')->on('countries');
    $table->integer('state_id')->unsigned();   // foreign
    $table->foreign('state_id')->references('id')->on('country_states');
    $table->string('city')->nullable();
    $table->string('district')->nullable();
    $table->string('area')->nullable();
    $table->string('zip')->nullable();
});

Lorsqu'un utilisateur s'inscrit sur le site Web, je n'ai besoin que de quelques champs, qui sont 用户名 电子邮件地址 密码 名字 姓氏 . Ce sont des champs obligatoires uniquement.

Par conséquent, les informations du tableau des partenaires peuvent être renseignées une fois que l'utilisateur a terminé son inscription sur le site Web.

Mais en raison de la structure des clés étrangères, je ne peux pas continuer à cause de cette erreur :

SQLSTATE[23000]: Integrity constraint violation: 1452 Cannot add or update a child row: a foreign key constraint fails (`mytable`.`tbl_partners`, CONSTRAINT `partners_country_id_foreign` FOREIGN KEY (`country_id`) REFERENCES `tbl_countries` (`id`)) (SQL: insert into `tbl_partners` (`first_name`, `last_name`, `display_name`, `email`, `updated_at`, `created_at`) values (Jack, Wilson, admin, admin@example.com, 2016-06-09 19:41:18, 2016-06-09 19:41:18))

Je sais que cela est dû à la table des pays requise par la table des partenaires.

Ma question est la suivante : existe-t-il une solution de contournement pour que je puisse remplir le tableau des partenaires avec le pays ou toute autre donnée non requise, tout en conservant le schéma de table externe pour le pays, l'état, etc.

P粉805107717P粉805107717423 Il y a quelques jours695

répondre à tous(2)je répondrai

  • P粉135799949

    P粉1357999492023-10-18 13:21:13

    Pour que Laravel 7.x crée une clé étrangère nullable, utilisez simplement :

    $table->foreignId('country_id')->nullable()->constrained();
    
    $table->foreignId('state_id')->nullable()->constrained();

    Rappelez-vous : la la nullitédoit avant être contrainte, sinon la nullabilité ne sera pas affectée.

    répondre
    0
  • P粉638343995

    P粉6383439952023-10-18 09:30:39

    Définissez country_idstate_id sur nullable comme indiqué ci-dessous.

    $table->integer('country_id')->nullable()->unsigned();
    
    $table->integer('state_id')->nullable()->unsigned();

    répondre
    0
  • Annulerrépondre