繁体   English   中英

Laravel数据库外键

[英]Laravel database foreign key

我想让用户具有用户,管理员,编辑器之类的等级。但是我不能从表中添加外键来对用户表中的列进行排序。

这是排名表迁移

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

默认情况下, users表迁移具有2014_10_12_000000时间戳,因此在手动创建的任何迁移之前都会创建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();
});

如果您的排名是固定的,则更好的设计是在用户表中添加一个ENUM字段。

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

常量在User类中定义的位置。 然后,您可以摆脱排名表。

-

例如,如果要将等级保留在单独的表中,以便管理员进行管理,则可以保留该等级,但先创建表,然后再添加外键。

另外,请利用rank_id约定,并调用外键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');
});

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM