Laravel Database Schema,Nullable Foreign

时间:2016-06-09 19:54:13

标签: php mysql database laravel

我有这两个数据库表:

  1. 用户表
  2. 合作伙伴表
  3. 用户表将处理此类信息

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

    虽然合作伙伴表将包含所有用户元信息,例如名字和姓氏等。

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

    当用户注册该网站时,我只想要几个字段usernameemail addresspasswordfirst namelast name。这些只是必填字段。

    因此,合作伙伴表中的信息可以在用户完成注册到站点之后填写。

    但是由于外键的结构,由于这个错误我无法继续下去:

    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))
    

    我知道这是由合作伙伴表所要求的国家/地区表格引起的 我的问题是:是否有解决办法,以便我可以填写合作伙伴表上的国家或任何其他非必需数据,但保留国家,州等的外国表格式。

4 个答案:

答案 0 :(得分:39)

设置country_idstate_id可以为空,如此。

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

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

答案 1 :(得分:19)

要让laravel 7.x创建可为空的外键,请简单地使用:

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

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

记住:可空应该在之前约束,否则可空变量将不会受到影响。

答案 2 :(得分:8)

在最新版本的Laravel中,您可以将nullableforeignKey结合使用:

$table
      ->foreignId('other_table_id')
      ->nullable() // here
      ->references('id')
      ->on('other_table');

答案 3 :(得分:1)

对于Laravel 7.x,我使用这种方式:

$table->bigInteger('word_type_id')->nullable()->unsigned();
$table->index('word_type_id')->nullable();
$table->foreign('word_type_id')->nullable()->references('id')->on('word_types')->onDelete('cascade');