8

我目前正在开发一个由主服务器和许多客户端组成的 Laravel 4 项目。客户端创建数据并将其发送到主服务器。为了避免冲突,我使用 UUID v4 作为主键。

但是,一旦在服务器上创建了数据,我想分配一个唯一的自动递增整数,以便用户更容易识别数据。例如:代替谈论item 5a8e896d-3ab4-48d2-9d39-faeb5227f012用户可以谈论item #24567

为了让我的应用程序易于管理,我正在使用迁移,我当前对该表的迁移如下所示:

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();
    });
}

问题是 Laravel 在定义自动增量时会自动创建一个主键,因此迁移最终会失败,因为有两个主键。

[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 ())

有没有办法使用 Laravel 4 迁移来获得具有主键和单独的自动递增字段的表。

4

4 回答 4

2

我发现了问题,Laravel 似乎正在为每个 auto_increment 字段创建一个主键。当我删除primary key它要求我提供索引的部分时,我呼吁->unique()迁移,但这也不起作用。更改return ' auto_increment primary key';return ' auto_increment unique'; 解决了我的问题,尽管它现在在核心中被黑了,这当然是不好的做法。

/**
 * 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';
    }
}
于 2013-03-24T10:31:02.577 回答
1

诀窍是像这样将它添加到 Schema::create 之外

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;');

然后重做迁移,密钥将在表 tableName 中创建名称 id 然后您可以像访问任何其他密钥一样访问它。

于 2017-05-14T01:36:56.880 回答
-1

我认为如果不修改核心文件就无法完成,因为创建 auto_increment 会自动使其成为主键。

如果您可以在 Larvel 框架开发中将其报告为错误,那就更好了。团队。

这里 谢谢:)

于 2013-06-18T09:38:29.780 回答
-2

是的,您可以在 Items 类的模型声明中执行此操作

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

}

现在您的主键不再是自动递增字段。

于 2013-03-23T17:32:19.843 回答