Как установить автоинкремент в не первичный ключ?
Как установить поле автоинкремента базы данных, которое не является первичным ключом в методе создания?
Единственный способ - использовать необработанный запрос?
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);
});