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


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

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

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

3 2

3 ответа:

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

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

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

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

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

public $incrementing = FALSE;