【问题标题】:Laravel database foreign keyLaravel 数据库外键
【发布时间】:2018-02-13 16:04:33
【问题描述】:

我希望用户有一个像用户、管理员、编辑器这样的等级......但是我不能从等级表中添加外键来在用户表中的等级列中。

这是排名表迁移

Schema::create('ranks', function (Blueprint $table) {
  $table->increments('id');
  $table->string('rank', 32)->charset('utf8')->nullable($value = false);
});

这就是用户表迁移

Schema::create('users', function (Blueprint $table) {
    $table->increments('id');
    $table->string('name', 64)->charset('utf8')->nullable($value = false);
    $table->string('email', 128)->unique()->charset('utf8')->nullable($value = false);
    $table->string('password', 128)->charset('utf8')->nullable($value = false);
    $table->integer('rank')->unsigned()->default(1);
    $table->foreign('rank')->references('id')->on('ranks')->nullable($value = false);
    $table->rememberToken();
    $table->timestamps();
});

【问题讨论】:

  • $table->foreign('rank')->references('id')->on('ranks')->nullable($value = false); 这行是什么意思?为什么可以为空()?你遇到了什么错误?
  • 删除所有$value = false和rank整数列的默认调用。
  • @Sohel0415 使 collum 不能为空 错误:SQLSTATE[HY000]:一般错误:1005 无法创建表 hots.#sql-268_5d df (errno: 150 "外键约束格式不正确”)(SQL:更改表users添加约束users_rank_foreign外键(rank)引用ranksid))
  • @Joel Hinz 不起作用

标签: php mysql laravel


【解决方案1】:

默认情况下,users 表迁移具有2014_10_12_000000 时间戳,因此它是在任何手动创建的迁移之前创建的。因此更改ranks 表迁移文件名时间戳以在users 表之前创建表。例如:

2013_10_12_000000_create_ranks_table.php
2014_10_12_000000_create_users_table.php

另外,将 FK 约束代码移动到单独的闭包中:

Schema::create('users', function (Blueprint $table) {
    $table->increments('id');
    $table->string('name', 64)->charset('utf8')->nullable($value = false);
    $table->string('email', 128)->unique()->charset('utf8')->nullable($value = false);
    $table->string('password', 128)->charset('utf8')->nullable($value = false);
    $table->integer('rank')->unsigned()->default(1);
    $table->rememberToken();
    $table->timestamps();
});

Schema::table('users', function (Blueprint $table) {
    $table->foreign('rank')->references('id')->on('ranks')->nullable();
});

【讨论】:

    【解决方案2】:

    如果您的排名是固定的,更好的设计是将ENUM 字段添加到用户表。

    $table->enum('rank', [User::LEVEL_ADMIN, User::LEVEL_EDITOR]);
    

    常量在 User 类中定义。然后你就可以摆脱排名表了。

    --

    如果您想将排名保留在一个单独的表中以便管理员管理它们,例如您可以保留它,但先创建表,然后再添加外键。

    此外,利用 Eloquent 约定并调用外键 rank_id,因此您无需在模型的关系方法中指定它。

    Schema::create('ranks', function (Blueprint $table) {
      $table->increments('id');
      $table->string('rank', 32)->charset('utf8');
    });
    
    Schema::create('users', function (Blueprint $table) {
        $table->increments('id');
        $table->string('name', 64)->charset('utf8');
        $table->string('email', 128)->unique()->charset('utf8');
        $table->string('password', 128)->charset('utf8');
        $table->integer('rank_id')->unsigned();
        $table->rememberToken();
        $table->timestamps();
    });
    
    Schema::table('users', function (Blueprint $table) {
        $table->foreign('rank_id')->references('id')->on('ranks');
    });
    

    【讨论】:

      猜你喜欢
      • 2015-03-02
      • 2016-08-20
      • 2018-10-05
      • 2014-03-30
      • 1970-01-01
      • 2015-07-07
      • 1970-01-01
      • 2022-06-13
      • 2017-09-15
      相关资源
      最近更新 更多