6

如何在创建方法上设置不是主键的数据库自动增量字段?

唯一的方法是使用原始查询?

DB::statement('ALTER TABLE table CHANGE field field INT(10)AUTO_INCREMENT');

4

5 回答 5

8

没有执行此操作。但是,我在Laravel 论坛上发现了这个:

Schema::table('table', function(Blueprint $t) {
    // Add the Auto-Increment column
    $t->increments("some_column");

    // Remove the primary key
    $t->dropPrimary("table_some_column_primary");

    // Set the actual primary key
    $t->primary(array("id"));
});

这未经测试,但应该可以工作。我不确定 Laravel 如何调用他们的主键,也许你必须先检查一下并调整该dropPrimary()行以使其工作。

于 2017-03-21T15:04:12.570 回答
3

在迁移时做一些解决方法我觉得不安全,所以我在模型文件中做了这个:

/**
 *  Setup model event hooks
 */
public static function boot()
{
    parent::boot();
    self::creating(function ($model) {
        $model->field_here = $model->max('field_here') + 1;
    });
}

如果要禁用自动增量,请在模型文件的开头添加:

public $incrementing = FALSE;
于 2018-05-01T19:32:37.937 回答
2
Schema::table('table_name', function(Blueprint $table) {
    DB::statement('ALTER TABLE table_name ADD column_name INT NOT NULL AUTO_INCREMENT AFTER after_column_name,  ADD INDEX (column_name)'); 
});
于 2020-12-08T11:32:44.037 回答
0

当前答案不起作用,自动递增列必须是主键。我建议firstOrCreate在插入时使用以获得相同级别的唯一性(前提是您仍然需要一个可用的自动递增键)。

于 2017-11-21T06:55:05.290 回答
0

我正在使用pgsql,我使用修饰符实现generatedAs()laravel 9

Schema::create('form_section', function (Blueprint $table) {
    $table->id()->from(100);
    $table->unsignedInteger('form_id');
    $table->foreign('form_id')->references('id')->on('forms');
    $table->unsignedInteger('section_id');
    $table->foreign('section_id')->references('id')->on('sections');
    $table->unsignedInteger('section_sequence')->generatedAs(); //solution
    $table->timestamps($precision = 0);
});
于 2022-03-02T09:18:09.507 回答