schema builder laravel di chuyển duy nhất trên hai cột


125

Làm cách nào để đặt các ràng buộc duy nhất trên hai cột?

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
Đáng buồn là mức độ chi tiết này lại bị thiếu trong tài liệu Laravel . Nó sẽ rất dễ dàng để đề cập đến nó khi đi qua. Các chi tiết như thế này và - ví dụ - thực tế là khung công tác dường như luôn giả định rằng mọi bảng sẽ tự động tăng dần id, tạo cho khung công tác một cảm giác nghiệp dư xung quanh các cạnh. Tôi đang chạy đua? :-(
cartbeforehorse

Câu trả lời:


277

Tham số thứ hai là đặt tên của chỉ mục duy nhất theo cách thủ công. Sử dụng một mảng làm tham số đầu tiên để tạo một khóa duy nhất trên nhiều cột.

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

hoặc (gọn gàng hơn một chút)

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

1
+1 cảm ơn vì điều này ... không chắc tôi đã bỏ sót nó như thế nào trong tài liệu. Chắc tôi bị mù rồi: P
OACDesigns 29/1113

Bằng cách nào đó, tôi cũng đã bỏ lỡ thực tế là tham số thứ hai là đặt tên chỉ mục theo cách thủ công và tôi đã có một tên chỉ mục được tạo tự động quá dài. Cảm ơn bạn! +1
Ciprian Mocanu

1
+1 cho array(). Bởi vì tôi đã thử mà không có mảng và nó không hoạt động. tôi có thể đặt tên ràng buộc trong khi chạy khóa tổng hợp thông qua trình tạo lược đồ không?
Pankaj

Vâng, đó là thông số thứ hai
Collin James

7
Các tên chỉ mục được tạo có định dạng table_column1_column2...n_uniquenếu ai đó không chắc chắn. Việc loại bỏ ràng buộc duy nhất sau đó sẽ tham chiếu đến điều đó trong$table->dropUnique('table_column1_column2...n_unique');
Jonathan

19

Đơn giản là bạn có thể sử dụng

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

Tham khảo: http://laravel.com/docs/master/migrations#creating-indexes

Ví dụ:

    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
Tuy nhiên, điều này không đảm bảo tính duy nhất, nó chỉ thêm một chỉ mục tổng hợp. Thông thường, bạn không muốn có cùng một thẻ hai lần trên cùng một bài đăng, vì vậy đối với trường hợp sử dụng này, tốt hơn nên sử dụng ->unique().
okdewit

3
@ Fx32 này không độc đáo đảm bảo bởi vì nó tạo ra một hỗn hợp khóa chính (được lập chỉ mục). Tuy nhiên, tôi vẫn đồng ý rằng điều đó ->unique()phù hợp hơn trong câu hỏi cụ thể này vì 'mytext'có thể sẽ tạo ra một khóa xấu như bất kỳ VARCHARhoặc TEXTcột nào. ->primary([])sẽ rất tốt để đảm bảo tính duy nhất trên các số nguyên chẳng hạn như khóa ngoại pivot.
Jeff Puckett

2
Cũng thông báo rằng khóa chính tổng hợp thường được tán thành bởi các nhà phát triển Laravel, và họ không được hỗ trợ bởi hùng biện - xem github.com/laravel/framework/issues/5355
andrechalom

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

một lời giải thích bằng lời nói sẽ là một bổ sung hữu ích cho câu trả lời của bạn
con
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.