模式构建器laravel迁移在两列中是唯一的


125

如何在两列上设置唯一约束?

class MyModel extends Migration {
  public function up()
  {
    Schema::create('storage_trackers', function(Blueprint $table) {
      $table->increments('id');
      $table->string('mytext');
      $table->unsignedInteger('user_id');
      $table->engine = 'InnoDB';
      $table->unique('mytext', 'user_id');
    });
  }
}

MyMode::create(array('mytext' => 'test', 'user_id' => 1);
// this fails??
MyMode::create(array('mytext' => 'test', 'user_id' => 2);


1
可悲的是Laravel文档中缺少了这种细节。顺便提及它会很容易。这样的细节,例如框架总是假设每个表都将具有自动递增的事实id,给框架带来了一些业余的感觉。我在抱怨吗?:-(
cartbeforehorse

Answers:


277

第二个参数是手动设置唯一索引的名称。使用数组作为第一个参数来创建跨多个列的唯一键。

$table->unique(array('mytext', 'user_id'));

或(稍微整洁)

$table->unique(['mytext', 'user_id']);

1
+1表示感谢...不确定我在文档中如何错过它。我必须是瞎子:P
OACDesigns

我也以某种方式错过了第二个参数是手动命名索引的事实,而我有一个自动生成的索引名称,该名称太长。谢谢你,兄弟!+1
Ciprian Mocanu '16

1
为+1 array()。因为我尝试了不使用数组,但是它没有用。通过“模式”构建器运行组合键时,我可以给约束名称吗?
Pankaj

是的,那是第二个参数
Collin James

7
table_column1_column2...n_unique如果任何人都不确定,则生成的索引名称将采用该格式。然后,删除唯一约束将引用$table->dropUnique('table_column1_column2...n_unique');
Jonathan'5

19

只需使用即可

$table->primary(['first', 'second']);

参考:http//laravel.com/docs/master/migrations#creating-indexes

举个例子:

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

        $table->integer('post_id')->unsigned();
        $table->integer('tag_id')->unsigned();

        $table->foreign('post_id')->references('id')->on('posts');
        $table->foreign('tag_id')->references('id')->on('tags');

        $table->timestamps();
        $table->softDeletes();

        $table->primary(['post_id', 'tag_id']);
    });

4
但是,这不能保证唯一性,它只是添加了一个复合索引。通常,您不希望在同一帖子上使用相同的标签两次,因此,对于此用例,最好使用->unique()
okdewit '16

3
@ Fx32 确实保证了唯一性,因为它创建了一个复合主键(已建立索引)。但是,我仍然同意->unique()在此特定问题上更合适,因为'mytext'这可能会像任何列VARCHARTEXT列那样造成错误的键。->primary([])对于确保整数(例如枢轴外键)的唯一性将非常有用。
杰夫·普基特

2
还要注意,复合主键通常受到Laravel开发人员的反对,而Eloquent不支持它们-请参见github.com/laravel/framework/issues/5355
andrechalom

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.