ChatGPT解决这个技术问题 Extra ChatGPT

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

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

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);
遗憾的是,Laravel docs 中缺少这种详细程度。顺便提一下很容易。像这样的细节和 - 例如 - 框架似乎总是假设每个表都将具有自动递增 id 的事实,给框架带来了边缘的业余感觉。我在吐槽吗? :-(

C
Chuck Le Butt

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

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

或(更整洁一点)

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

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

只需您可以使用

$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->primary(['post_id', 'tag_id']);
    });

但是,这并不能保证唯一性,它只是添加了一个复合索引。通常,您不希望在同一篇文章中出现两次相同的标签,因此对于这个用例,最好使用 ->unique()
@Fx32 这 确实 保证唯一性,因为它创建了一个复合 主键 (被索引)。但是,我仍然同意 ->unique() 在这个特定问题中更合适,因为 'mytext' 可能会像任何 VARCHARTEXT 列一样导致错误的键。 ->primary([]) 非常适合确保整数(例如枢轴外键)的唯一性。
另请注意,Laravel 开发人员通常不赞成复合主键,并且 Eloquent 不支持它们 - 请参阅 github.com/laravel/framework/issues/5355
M
Malki Mohamed

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

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

T
Tony
DB::statement("ALTER TABLE `project_majr_actvities`
               ADD UNIQUE `unique_index`(`activity_sr_no`, `project_id`)");

口头解释将有助于您的回答