স্কিমা বিল্ডার লারাভেল মাইগ্রেশন দুটি কলামে অনন্য


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
এই স্তরের বিশদটি দুঃখজনকভাবে লারাভেল ডক্স থেকে অনুপস্থিত । পাস করার সময় এটি উল্লেখ করা এত সহজ হবে। এর মতো বিশদ এবং - উদাহরণস্বরূপ - ফ্রেমওয়ার্কটি সর্বদা মনে হয় যে প্রতিটি টেবিলটিতে স্বয়ং-বর্ধমান হবে id, কাঠামোটিকে প্রান্তগুলির চারপাশে একটি অপেশাদার অনুভূতি দেয়। আমি কি ভাড়া নিচ্ছি? :-(
কার্টবোরহর্স

উত্তর:


277

দ্বিতীয় পরম হ'ল ম্যানুয়ালি অনন্য সূচকের নাম সেট করা। একাধিক কলামে অনন্য কী তৈরি করতে প্রথম প্যারাম হিসাবে একটি অ্যারের ব্যবহার করুন।

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

বা (একটু পরিষ্কার)

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

1
এটির জন্য +1 ধন্যবাদ ... ডকুমেন্টেশনে এটি কীভাবে আমি মিস করেছি তা নিশ্চিত নয়। আমাকে অবশ্যই অন্ধ হতে হবে: পি
OACDesigns

আমি দ্বিতীয়ত পরমটি ম্যানুয়ালি সূচকটির নামকরণ করার বিষয়টিও হারিয়ে গেলাম এবং আমার একটি স্বয়ংক্রিয়ভাবে উত্পন্ন সূচকের নাম ছিল যা খুব দীর্ঘ। আপনি মানুষ ধন্যবাদ! +1
সিপরিয়ান মোকানু

1
+1 এর জন্য array()। কারণ আমি অ্যারে ছাড়াই চেষ্টা করেছি এবং এটি কার্যকর হয়নি। আমি স্কিমা বিল্ডারের মাধ্যমে যৌগিক কী চালানোর সময় বাধা নাম দিতে পারি?
পঙ্কজ

হ্যাঁ, এটি দ্বিতীয় পরম
কলিন জেমস

7
উত্পন্ন সূচকগুলির নামগুলি table_column1_column2...n_uniqueযদি কেউ অনিশ্চিত থাকে তবে ফর্ম্যাটে থাকে। অনন্য সীমাবদ্ধতা ফেলে দেওয়ার পরে তা উল্লেখ করা হবে$table->dropUnique('table_column1_column2...n_unique');
জোনাথন

19

সহজভাবে আপনি ব্যবহার করতে পারেন

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

তথ্যসূত্র: http://laravel.com/docs/master/migration#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

3
@ Fx32 এই করে কারণ এটি একটি যৌগিক সৃষ্টি গ্যারান্টি স্বতন্ত্রতা প্রাথমিক কী (যা সূচীবদ্ধ করা হয়)। তবে, আমি এখনও সম্মত হই যে ->unique()এই নির্দিষ্ট প্রশ্নে আরও উপযুক্ত কারণ 'mytext'সম্ভবত কোনও VARCHARবা TEXTকলামের মতো খারাপ কী তৈরি করতে পারে for ->primary([])পিভট বিদেশী কীগুলির মতো পূর্ণসংখ্যার অনন্যতা নিশ্চিত করার জন্য দুর্দান্ত হবে be
জেফ পেকেট

2
এছাড়াও নোটিশ যৌগিক প্রাথমিক কী সাধারণত Laravel ডেভেলপারদের দ্বারা উপর frowned, এবং তারা বলিয়ে দ্বারা সমর্থিত নয় যে - দেখুন github.com/laravel/framework/issues/5355
andrechalom

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.