una migrar migraciones migracion especifica ejecutar php mysql database-design laravel laravel-4

php - migrar - migraciones laravel



Laravel 4: ¿Cómo creo una columna de incremento automático no principal con migraciones? (4)

Creo que no se puede hacer sin modificar los archivos centrales, ya que la creación de un incremento automático lo convierte en una clave principal.

Mejor si puedes reportarlo como un error en el desarrollador de framework Larvel. equipo.

aquí gracias :)

Actualmente estoy trabajando en un proyecto de Laravel 4 que consiste en un servidor maestro y muchos clientes. Los clientes crean datos y lo envían al servidor maestro. Para evitar conflictos, estoy usando UUID v4 como clave principal.

Sin embargo, una vez que se crean los datos en el servidor, quiero asignar un entero exclusivo de incremento automático para que sea más fácil para los usuarios identificar los datos. Por ejemplo: en lugar de hablar sobre el item 5a8e896d-3ab4-48d2-9d39-faeb5227f012 un usuario puede hablar sobre el item #24567

Para mantener mi aplicación manejable, estoy usando migraciones, mi migración actual para esta tabla se ve así:

public function up() { Schema::table(''items'', function($table) { $table->create(); $table->string(''id'')->primary(); //''id'' For the purpose of keeping the ORM working, this field stores the UUID. $table->integer(''number'', true); //The human readable item number, the second parameter is true for auto-increment $table->text(''otherdata''); $table->timestamps(); }); }

El problema es que Laravel crea automágicamente una clave primaria al definir el autoincremento, por lo que la migración termina fallando porque hay dos claves principales.

[Exception] SQLSTATE[42000]: Syntax error or access violation: 1068 Multiple primary key defined (SQL: alter table `items` add primary key items_id_primary(`id`)) (Bindings: array ())

¿Hay alguna forma de tener una tabla con una clave principal y un campo de autoincremento separado usando migraciones de Laravel 4?


El truco es agregarlo fuera de Schema :: create like this

Schema::create(''payments'', function(Blueprint $table) { $table->string(''primaryKey'', 30); $table->primary(''primaryKey''); //... }); DB::statement(''ALTER Table tableName add id INTEGER NOT NULL UNIQUE AUTO_INCREMENT;'');

A continuación, vuelva a realizar las migraciones, la clave se creará con el id. De nombre en la tabla tableName y podrá acceder a ella como a cualquier otra tecla.


Encontré el problema, Laravel parece estar creando una clave principal para cada campo auto_increment. Cuando eliminé la parte de la primary key , me pidió que proporcionara un índice para llamar a ->unique() en la migración, pero esto tampoco funcionó. Cambiando la return '' auto_increment primary key''; para return '' auto_increment unique'' ; Resolvió mi problema, aunque ahora está pirateado en el núcleo, lo que por supuesto es una mala práctica.

/** * Get the SQL for an auto-increment column modifier. * * @param Illuminate/Database/Schema/Blueprint $blueprint * @param Illuminate/Support/Fluent $column * @return string|null */ protected function modifyIncrement(Blueprint $blueprint, Fluent $column) { if ($column->type == ''integer'' and $column->autoIncrement) { return '' auto_increment unique''; //return '' auto_increment primary key''; } }


Sí, puedes hacerlo en tu declaración de modelo de tu clase Artículos

class Items extends Eloquent { /** * Indicates if the IDs are auto-incrementing. * * @var bool */ public $incrementing = false; }

ahora su clave principal ya no es un campo incrementado automáticamente.