我有如下的迁移
$table->increments('id');
$table->integer('order_num');
$table->timestamps();
主键应该是id和order_num的组合。如果我把下面的代码,它说我试图添加2个主键(因为增量也是主键)。有没有办法告诉我雄辩,我试图将两者结合在一起
$table->primary(['course_id', 'order_num']);
答案 0 :(得分:5)
我认为你正在使用 MySQL 。
首先,默认的MySQL引擎 InnoDB 不允许复合主键,其中一个字段是自动增量。允许的引擎是 MyISAM ,因此您需要做的第一件事就是更改表格的引擎。
您可以通过在表定义中添加以下内容来实现:
$table->engine = 'MyISAM';
您需要解决的下一个问题是Laravel的架构构建器假定您设置为自动增量的列是您的主键。这就是为什么你已经收到关于主键的错误 - Laravel已经将 id 字段作为主键。
要解决此问题,您需要将 id 字段声明为普通整数列,定义所有其他列,并在末尾声明复合主键。它可能看起来像那样:
$table->integer('id');
$table->integer('order_num');
$table->timestamps();
$table->primary(['course_id', 'order_num']);
这样您就创建了一个复合主键。唯一缺少的是 id 列上的autoincrement属性。 Laravel的模式构建器不提供更改现有列的方法,这就是您需要运行原始SQL查询的原因。您需要的查询是:
DB::statement('ALTER TABLE my_table MODIFY id INTEGER NOT NULL AUTO_INCREMENT');
总而言之,您的迁移式up()方法可能如下所示:
public function up()
{
Schema::create('my_table', function (Blueprint $table) {
$table->engine = 'MyISAM';
$table->integer('id');
$table->integer('order_num');
$table->timestamps();
$table->primary(['course_id', 'order_num']);
});
DB::statement('ALTER TABLE my_table MODIFY id INTEGER NOT NULL AUTO_INCREMENT');
}