2つの列で一意のスキーマビルダーlaravel移行


125

2つの列に一意の制約を設定するにはどうすればよいですか?

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 2017

回答:


277

2番目のパラメーターは、一意のインデックスの名前を手動で設定することです。複数の列にまたがる一意のキーを作成するには、最初のパラメーターとして配列を使用します。

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

または(少しすっきり)

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

1
+1ありがとうございます...ドキュメントでどのようにして見逃したのかわかりません。私は盲目でなければなりません:P
OACDesigns 2013年

また、2番目のパラメーターが手動でインデックスに名前を付けることであり、自動生成されたインデックス名が長すぎるという事実を見落としました。ありがとう、男!+1
シプリアンモカヌ

1
の+1 array()。配列なしで試してみましたが、うまくいきませんでした。Schema Builderで複合キーを実行しているときに制約名を指定できますか?
Pankaj 2016

ええ、それは2番目のパラメーターです
コリン・ジェームス

7
生成されたインデックス名は、table_column1_column2...n_unique不明な場合の形式になります。一意の制約を削除することは、それを参照することになります$table->dropUnique('table_column1_column2...n_unique');
ジョナサン

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
ただし、これは一意性を保証するものではなく、複合インデックスを追加するだけです。通常、同じ投稿で同じタグを2回使用したくないので、この使用例ではを使用することをお勧めします->unique()
okdewit

3
@ Fx32 複合プライマリキー(インデックス付き)を作成するため、これ一意性を保証します。しかし、私はまだそれが同意しているため、この特定の問題の方が適している任意のと同じように、おそらく悪いキーのためになるだろうか列。ピボット外部キーなどの整数の一意性を確保するのに最適です。->unique()'mytext'VARCHARTEXT->primary([])
Jeff Puckett 2017年

2
また、コンポジット主キーは一般にLaravel開発者に不快感を与え
andrechalom

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.