架构构建器laravel迁移在两列上唯一

use*_*986 97 database-schema laravel-4

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

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);
Run Code Online (Sandbox Code Playgroud)

Col*_*mes 229

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

$table->unique(array('mytext', 'user_id'));
Run Code Online (Sandbox Code Playgroud)

或者(有点整洁)

$table->unique(['mytext', 'user_id']);
Run Code Online (Sandbox Code Playgroud)

  • 如果有人不确定,生成的索引名称格式为`table_column1_column2 ... n_unique`.删除唯一约束将引用`$ table-> dropUnique('table_column1_column2 ... n_unique');` (5认同)
  • @Jonathan您还可以将传递给“unique()”的相同数组传递给“dropUnique()”,以保证约束/索引名称相同。 (3认同)
  • +1谢谢你...不知道我是如何在文档中错过它的。我一定是瞎了:P (2认同)
  • 我还不知何故错过了第二个参数是手动命名索引的事实,而我有一个自动生成的索引名称太长了。谢谢你,兄弟!+1 (2认同)
  • +1 为 `array()`。因为我在没有数组的情况下尝试过,但没有奏效。我可以在通过 Schema builder 运行复合键时给出约束名称吗? (2认同)

Mal*_*med 17

如果您有一个包含一列的默认唯一索引,并且您将使用两列更改它,或者创建一个包含两列的新索引,则此脚本将为您执行此操作:

public function up()
{
    Schema::table('user_plans', function (Blueprint $table) {
        $table->unique(["email", "plan_id"], 'user_plan_unique');
    });
}

public function down()
{
    Schema::table('user_plans', function (Blueprint $table) {
      $table->dropUnique('user_plan_unique');
    });
}
Run Code Online (Sandbox Code Playgroud)


İsm*_*urt 15

只需你可以使用

$table->primary(['first', 'second']);
Run Code Online (Sandbox Code Playgroud)

参考: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']);
    });
Run Code Online (Sandbox Code Playgroud)

  • 但这不保证唯一性,它只是添加了一个复合索引.通常,您不希望在同一个帖子上使用相同的标记两次,因此对于此用例,最好使用` - > unique()`. (4认同)
  • @ Fx32这样可以确保唯一性,因为它创建了复合的主键(已编制索引)。但是,我仍然同意`-> unique()`在这个特定问题上更合适,因为`mytext'可能会像任何VARCHAR或TEXT列一样构成一个错误的键。`-> primary([])`对于确保整数(例如枢轴外键)的唯一性非常有用。 (3认同)
  • 还要注意,复合主键通常被Laravel开发人员所皱眉,而Eloquent不支持它们-请参见https://github.com/laravel/framework/issues/5355 (2认同)