Laravel Eloquent 创建使用自动增量的组合键
Laravel Eloquent create composite key that uses autoincrements
我有一个如下所示的迁移
$table->increments('id');
$table->integer('order_num');
$table->timestamps();
主键应该是id和order_num的组合。如果我输入下面的代码,它会说我正在尝试添加 2 个主键(因为增量也是一个主键)。有没有办法告诉 eloquent 我正在尝试将两者结合在一起
$table->primary(['course_id', 'order_num']);
我假设您正在使用 MySQL。
首先,默认的 MySQL 引擎 InnoDB 不允许其中一个字段自动递增的复合主键。允许的引擎是 MyISAM,因此您需要做的第一件事是更改 table.
的引擎
您可以通过将以下内容添加到您的 table 定义中来做到这一点:
$table->engine = 'MyISAM';
您需要解决的下一个问题是 Laravel 的架构构建器假定您设置为 autoincrement 的列是您的主键。这就是为什么您收到关于主键已经存在的错误 - Laravel 已经将 id 字段设为主键。
要解决这个问题,您需要将id 字段声明为普通整数列,定义所有其他列,最后声明复合主键。它可能看起来像这样:
$table->integer('id');
$table->integer('order_num');
$table->timestamps();
$table->primary(['course_id', 'order_num']);
这样你就创建了一个复合主键。唯一缺少的是 id 列上的自动增量属性。 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');
}
我有一个如下所示的迁移
$table->increments('id');
$table->integer('order_num');
$table->timestamps();
主键应该是id和order_num的组合。如果我输入下面的代码,它会说我正在尝试添加 2 个主键(因为增量也是一个主键)。有没有办法告诉 eloquent 我正在尝试将两者结合在一起
$table->primary(['course_id', 'order_num']);
我假设您正在使用 MySQL。
首先,默认的 MySQL 引擎 InnoDB 不允许其中一个字段自动递增的复合主键。允许的引擎是 MyISAM,因此您需要做的第一件事是更改 table.
的引擎您可以通过将以下内容添加到您的 table 定义中来做到这一点:
$table->engine = 'MyISAM';
您需要解决的下一个问题是 Laravel 的架构构建器假定您设置为 autoincrement 的列是您的主键。这就是为什么您收到关于主键已经存在的错误 - Laravel 已经将 id 字段设为主键。
要解决这个问题,您需要将id 字段声明为普通整数列,定义所有其他列,最后声明复合主键。它可能看起来像这样:
$table->integer('id');
$table->integer('order_num');
$table->timestamps();
$table->primary(['course_id', 'order_num']);
这样你就创建了一个复合主键。唯一缺少的是 id 列上的自动增量属性。 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');
}