Laravel数据库外键

时间:2018-02-13 16:04:34

标签: php mysql laravel

我希望用户拥有像用户,管理员,编辑器这样的排名......但是我无法从排名表中添加外键来排名用户表中的列。

这是排名表迁移

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

2 个答案:

答案 0 :(得分:2)

默认情况下,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();
});

答案 1 :(得分:0)

如果您的排名已修复,则更好的设计是将ENUM字段添加到users表。

$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');
});