Как установить автоинкремент в не первичный ключ?

Как установить поле автоинкремента базы данных, которое не является первичным ключом в методе создания?

Единственный способ - использовать необработанный запрос?

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

7 ответов

Решение

Это не реализовано для этого. Тем не менее, я нашел это на форумах 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() линия, чтобы заставить это работать.

Я не чувствую себя безопасным, делая некоторые обходные пути при миграциях, поэтому я сделал это в файле модели:

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

Если вы хотите отключить автоинкремент, добавьте это в начале файла модели:

public $incrementing = FALSE;
      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)'); 
});

У меня была проблема, подобная вашей, я мог решить ее, поэтому попробуйте этот пример, он работает:

      Schema::create('etendu', function (Blueprint $table) {



            $table->Increments('id_etendu');

            $table->Integer('TypeActivite');

            $table->Integer('id_activite')->unsigned();

            $table->Integer('id_wilaya')->unsigned();

            $table->Integer('id_user')->unsigned();

            // autoIncrements needs index 
            $table->index(['id_etendu']);

            // Remove the primary key
            $table->dropPrimary("id_etendu");

            $table->foreign('id_activite')
            ->references('id')
            ->on('activite')
            ->onCascade('delete');

            $table->foreign('id_wilaya')
            ->references('id')
            ->on('wilayas')
            ->onCascade('delete');

            $table->foreign('id_user')
            ->references('id')
            ->on('user')
            ->onCascade('delete');
             // make them unique
            $table->unique(['id_etendu','id_activite','id_wilaya']);
            // make it primary key
            $table->primary('id_etendu');
        });

Текущий ответ не работает, автоинкрементные столбцы должны быть первичными ключами. Я рекомендую использовать firstOrCreate при вставке, чтобы получить тот же уровень уникальности (при условии, что вы все еще хотите, чтобы был доступен автоинкрементный ключ).

Я хотел иметь либо столбец id типа UUID в качестве основного столбца, а также row_number типа целое число и автоинкремент .

решение Ларавел 10 :

      Schema::create('my_table', function (Blueprint $table) {
    $table->uuid('id');
    $table->bigIncrements('row_number')->index();

    // other columns ...

    $table->dropPrimary('row_number');
    $table->primary('id');
});

я использовал 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);
});
Другие вопросы по тегам