Laravel Eloquent创建使用自动增量的复合键

Vin*_*ghu 3 php mysql laravel eloquent laravel-5.1

我有一个如下的迁移

        $table->increments('id');
        $table->integer('order_num');
        $table->timestamps();
Run Code Online (Sandbox Code Playgroud)

主键应该是id和order_num的组合.如果我把下面的代码,它说我正在尝试添加2个主键(因为增量也是主键).有没有办法告诉雄辩,我正试图将两者结合在一起

        $table->primary(['course_id', 'order_num']);
Run Code Online (Sandbox Code Playgroud)

jed*_*ylo 5

我假设您正在使用MySQL.

首先,默认的MySQL引擎InnoDB不允许复合主键,其中一个字段是自动增量.允许它的引擎是MyISAM,因此您需要做的第一件事就是更改表的引擎.

您可以通过在表定义中添加以下内容来实现:

$table->engine = 'MyISAM';
Run Code Online (Sandbox Code Playgroud)

您需要解决的下一个问题是Laravel的架构构建器假设您设置为自动增量的列是您的主键.那就是为什么你已经得到关于主键存在的错误--Laravel已经将id字段作为主键.

要解决此问题,您需要将id字段声明为普通整数列,定义所有其他列,并在末尾声明复合主键.它可能看起来像这样:

$table->integer('id');
$table->integer('order_num');
$table->timestamps();
$table->primary(['course_id', 'order_num']);
Run Code Online (Sandbox Code Playgroud)

这样您就创建了一个复合主键.唯一缺少的是id列上的autoincrement属性.Laravel的模式构建器不提供更改现有列的方法,这就是您需要运行原始SQL查询的原因.您需要的查询是:

DB::statement('ALTER TABLE my_table MODIFY id INTEGER NOT NULL AUTO_INCREMENT');
Run Code Online (Sandbox Code Playgroud)

总而言之,您的迁移的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');
}
Run Code Online (Sandbox Code Playgroud)