অভিবাসন: বিদেশী কী সীমাবদ্ধতা যুক্ত করা যায় না


206

আমি লারভেলে বিদেশী কী তৈরি করার চেষ্টা করছি তবে আমি যখন আমার টেবিলটি ব্যবহার artisanকরে নীচের ত্রুটিটি ছুঁড়ে ফেলেছি তখন :

[Illuminate\Database\QueryException]
SQLSTATE[HY000]: General error: 1215 Cannot add foreign key constraint (SQL
: alter table `priorities` add constraint priorities_user_id_foreign foreign 
key (`user_id`) references `users` (`id`))     

আমার মাইগ্রেশন কোডটি হ'ল:

অগ্রাধিকার স্থানান্তর ফাইল

public function up()
{
    //
    Schema::create('priorities', function($table) {
        $table->increments('id', true);
        $table->integer('user_id');
        $table->foreign('user_id')->references('id')->on('users');
        $table->string('priority_name');
        $table->smallInteger('rank');
        $table->text('class');
        $table->timestamps('timecreated');
    });
}

/**
 * Reverse the migrations.
 *
 * @return void
 */
public function down()
{
    //
    Schema::drop('priorities');
}

ব্যবহারকারীদের স্থানান্তর ফাইল

public function up()
{
    //
    Schema::table('users', function($table)
    {
    $table->create();
    $table->increments('id');
    $table->string('email');
    $table->string('first_name');
    $table->string('password');
    $table->string('email_code');
    $table->string('time_created');
    $table->string('ip');
    $table->string('confirmed');
    $table->string('user_role');
    $table->string('salt');
    $table->string('last_login');

    $table->timestamps();
    });
}

/**
 * Reverse the migrations.
 *
 * @return void
 */
public function down()
{
    //
        Schemea::drop('users');
}

আমি কী ভুল করেছি সে সম্পর্কে কোনও ধারণা, আমি এখনই এটি পেতে চাই, যেহেতু আমার প্রচুর টেবিল তৈরি করা দরকার যেমন আমি ব্যবহারকারী, ক্লায়েন্ট, প্রকল্প, কার্য, পরিস্থিতি, অগ্রাধিকার, প্রকার, দলসমূহ। আদর্শভাবে আমি টেবিলগুলি তৈরি করতে চাই যা বিদেশী কী, i..e clients_projectএবং project_tasksইত্যাদি সহ এই ডেটা ধারণ করে hold

আশা করি কেউ আমাকে শুরু করতে সহায়তা করতে পারে।

উত্তর:


356

এটি দুটি পদক্ষেপে যুক্ত করুন এবং এটিও স্বাক্ষরবিহীন করা ভাল:

public function up()
{
    Schema::create('priorities', function($table) {
        $table->increments('id', true);
        $table->integer('user_id')->unsigned();
        $table->string('priority_name');
        $table->smallInteger('rank');
        $table->text('class');
        $table->timestamps('timecreated');
    });

   Schema::table('priorities', function($table) {
       $table->foreign('user_id')->references('id')->on('users');
   });

}

117
ধন্যবাদ, আন্তোনিও! আমার পক্ষে সমস্যাটি ইউজার_আইডি কলামে স্বাক্ষরযুক্ত () যুক্ত করা হয়নি যাতে এটি ব্যবহারকারীদের টেবিলে আইডি কলামের ডেটা টাইপের সাথে মেলে। লারাভেলের ইনক্রিমেন্ট ('আইডি') ফাংশন একটি স্বাক্ষরবিহীন পূর্ণসংখ্যা তৈরি করে, সুতরাং বিদেশী কী কলামটিও স্বাক্ষরবিহীন হওয়া দরকার।
ব্র্যাড গ্রিফিথ

7
স্বাক্ষরবিহীন যোগ করা, Schema::tableপদ্ধতি পৃথক থেকে বাদ ! ধন্যবাদ!
patrickjason91

4
আমার জন্য এটি আইডিটি স্বাক্ষরবিহীন হিসাবে তৈরি করছিল না। বখশিশের জন্য ধন্যবাদ.
কার্ল ওয়েইস

6
সমাধানটি ব্র্যাডগ্রিফির মন্তব্যে রয়েছে। আমার উপরে উল্লিখিত হিসাবে মোটেও আলাদা করার দরকার নেই। সেই অনুযায়ী উত্তর আপডেট করা আরও ভাল।
Matanya

11
$table->unsignedBigInteger('user_id')আপনার ইউজারআইডিটি থাকলে ব্যবহার করুনbigIncrements
মাকসিম ইভানভ

114

প্রশ্নের ইতিমধ্যে উত্তর দেওয়া হয়েছে, তবে আশা করি এটি অন্য কাউকে সাহায্য করবে।

এই ত্রুটিটি আমার জন্য ঘটেছিল কারণ আমি মূল টেবিলে একটি প্রাথমিক কী হিসাবে কীটি বিদ্যমান থাকার আগে প্রথমে বিদেশী কী দিয়ে মাইগ্রেশন টেবিলটি তৈরি করেছি। চলার পরে উত্পন্ন ফাইলের নাম দ্বারা নির্দেশিত হিসাবে মাইগ্রেশনগুলি তৈরি করা হয়েছিল তার ক্রমে কার্যকর করা হয় migrate:make। যেমন 2014_05_10_165709_create_student_table.php

সমাধানটি এখানে প্রস্তাবিত হিসাবে প্রাথমিক কী সহ ফাইলের চেয়ে আগের সময়ের জন্য বিদেশী কী দিয়ে ফাইলটির নামকরণ করা হয়েছিল: http://forumsarchive.laravel.io/viewtopic.php?id=10246

আমার মনে হয় আমাকেও যুক্ত করতে হয়েছিল $table->engine = 'InnoDB';


4
মাইগ্রেশন ফাইলটির নতুন নামকরণের পরে এবং কিছু ত্রুটি পাওয়ার পরে যেমন: স্ট্রিমটি খুলতে ব্যর্থ: এ জাতীয় কোনও ফাইল বা ডিরেক্টরি নেই (এবং পুরানো মাইগ্রেশন নামটি প্রদর্শিত হয়) আপনাকে চালাতে হবে: সুরকার ডাম্প-অটোলোয়াড
স্টেলিয়ান

14
$ টেবিল-> ইঞ্জিন = 'ইনোডিবি'; মাইএসকিএল স্তরে বিদেশী কী প্রয়োগ করা প্রয়োজন। ডিফল্ট লারাভেল ইঞ্জিনটি মাই আইসাম, যা বিদেশী কী সমর্থন করে না!
ফ্রেঞ্চোইস ব্রেটন

2
এটি আমার পক্ষেও কাজ করেছে, ধন্যবাদ। তবে এটি আমার কাছে কিছুটা অদ্ভুত বলে মনে হয় যে এটি এইভাবে কাজ করে। আমার অর্থ, এটি অর্থবোধ করে, তবে ম্যানুয়ালি ফাইলগুলির নাম পরিবর্তন করা এবং প্রক্রিয়াটিতে নকল তারিখ নিয়ে আসা ছাড়াও মাইগ্রেশন মৃত্যুদণ্ড কার্যকর করার আদেশ নির্দিষ্ট করার উপায় থাকা উচিত
এলিসিয়াস

2
আমি এখানে এসেছি কারণ আমি কোনও ত্রুটি পাচ্ছিলাম না, তবে আমি কলামটিতে ভুল মান যুক্ত করতে পেরেছিলাম যা একটি বিদেশী কী ছিল। তারপরে আমি ইনোডিবি সম্পর্কে মন্তব্য এবং উত্তরটি দেখেছি। এটি জানতে ভাল ছিল। ধন্যবাদ বন্ধুরা :)
সুপারনোভা

2
স্থানান্তর করার সময় আপনি যে ক্রমটিতে আপনার স্থানান্তরগুলি তৈরি করেছেন তা এখনও গুরুত্বপূর্ণ রয়েছে। আমি এই ইস্যুতে দৌড়েছি কিন্তু এটি সমাধান করেছে।
mugabits

60

লারাভেল ^ 5.8

লারাভেল ৫.৮ হিসাবে , মাইগ্রেশন স্টাবগুলি ডিফল্টরূপে আইডি কলামগুলিতে বিগ আইক্রেনমেন্ট পদ্ধতি ব্যবহার করে। পূর্বে, আইডি কলামগুলি ইনক্রিমেন্ট পদ্ধতি ব্যবহার করে তৈরি করা হয়েছিল।

এটি আপনার প্রকল্পের কোনও বিদ্যমান কোডকে প্রভাবিত করবে না; তবে, সচেতন থাকবেন যে বিদেশী কী কলামগুলি একই ধরণের হওয়া উচিত । অতএব, ইনক্রিমেন্ট পদ্ধতি ব্যবহার করে তৈরি একটি কলাম বিগআইক্রিমেন্টস পদ্ধতি ব্যবহার করে তৈরি কলামকে উল্লেখ করতে পারে না

উত্স: মাইগ্রেশন এবং বিগ আইক্রেনমেন্টস


উদাহরণ

এর আপনি একটি সহজ ভূমিকা ভিত্তিক অ্যাপ্লিকেশন নির্মাণ করা হয়, এবং আপনি প্রয়োজন উল্লেখ কল্পনা করা যাক USER_ID মধ্যে পিভট টেবিল "role_user"

2019_05_05_112458_create_users_table.php

// ...

public function up()
{
    Schema::create('users', function (Blueprint $table) {

        $table->bigIncrements('id');

        $table->string('full_name');
        $table->string('email');
        $table->timestamps();
    });
}

2019_05_05_120634_create_role_user_pivot_table.php

// ...

public function up()
{
    Schema::create('role_user', function (Blueprint $table) {

        // this line throw QueryException "SQLSTATE[HY000]: General error: 1215 Cannot add foreign key constraint..."
        // $table->integer('user_id')->unsigned()->index();

        $table->bigInteger('user_id')->unsigned()->index(); // this is working
        $table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
    });
}

যেহেতু আপনি দেখতে পারেন, মন্তব্য লাইন, একটি ক্যোয়ারী ব্যতিক্রম নিক্ষেপ, কারণ হিসাবে আপগ্রেড নোট উল্লেখ, হবে ফরেইন কী কলাম একই ধরনের হতে হবে , সুতরাং আপনি foreing কী (এই উদাহরণে এটা উভয় পরিবর্তন করতে হবে USER_ID করার জন্য) bigInteger মধ্যে role_user টেবিল বা পরিবর্তন bigIncrements করার পদ্ধতি বাড়তি পদ্ধতি ব্যবহারকারীদের টেবিল এবং পিভট সারণীতে মন্তব্য লাইন ব্যবহার, এটা আপনার উপর নির্ভর করে।


আমি আশা করি আমি আপনার কাছে এই বিষয়টি পরিষ্কার করতে সক্ষম হয়েছি।


1
ধন্যবাদ. তুমি আমার জীবন বাঁচিয়েছ আপনার ব্যাখ্যার অনুসরণ করে, আমি আপনার বিদেশী কীটি আপনার পরামর্শ অনুসারে বিগইন্টিজারে বদলেছি। Schema::table('goal_objective', function (Blueprint $table) { $table->bigInteger('job_title_id')->after('target')->unsigned()->nullable(); $table->foreign('job_title_id')->references('id')->on('job_titles')->onDelete('set null'); } এটা কাজ করেছে. ধন্যবাদ.
ব্রুস টং

1
ব্রুসটং, আমি আনন্দিত যে আমি সাহায্য করতে পেরেছি।
ছেবি

1
হ্যাঁ এটি সর্বাধিক প্রাসঙ্গিক উত্তর।
মোহাম্মদ আবদুল মুজিব

1
এই উত্তরটি খুব সহায়ক।
করিম পাজোকি

1
সর্বোত্তম উত্তর. আপনাকে ধন্যবাদ
বিশাল প্রকাশ

49

আমার ক্ষেত্রে, সমস্যাটি ছিল যে প্রধান টেবিলটিতে এর মধ্যে ইতিমধ্যে রেকর্ড রয়েছে এবং আমি নতুন কলামটি NULL না করার জন্য জোর করেছিলাম। সুতরাং নতুন কলামে একটি -> nullable () যুক্ত করে কৌশলটি করেছেন। প্রশ্নের উদাহরণে এরকম কিছু হবে:

$table->integer('user_id')->unsigned()->nullable();

বা:

$table->unsignedInteger('user_id')->nullable();

আশা করি এটি কারও সাহায্য করবে!


মনে রাখবেন যে আপনার পিতামাতার টেবিলে থাকা 'আইডি' কলামটিও স্বাক্ষরিত হওয়া দরকার! একটি লাইন যেমন $ টেবিল-> ইনক্রিমেন্ট ('আইডি') ব্যবহার করে; স্বয়ংক্রিয়ভাবে স্বাক্ষরবিহীন ডিফল্ট হবে।
কলিন স্টাডিগ

এটি আমার পক্ষে কাজ করেছে। আমি পিতামাতার টেবিল আইডির ডেটা টাইপটিকে বিগআইক্রেনমেন্ট থেকে ইনক্রিমেন্টে পরিবর্তন করেছি।
ইমানুয়েল বেনসন

22

আমার ক্ষেত্রে সমস্যাটি হ'ল usersটেবিলের জন্য স্বয়ংক্রিয়ভাবে উত্পন্ন মাইগ্রেশনটি সেট করা ছিল

...
$table->bigIncrements('id');
...

সুতরাং আমি কলামের ধরণ পরিবর্তন করতে হয়েছিল


$table->bigInteger('id');

বিদেশী কী কাজের সাথে আমার স্থানান্তর করতে make

লারাভেল সহ এটি 5.8.2


কারণ বিদেশী কী কলামে অবশ্যই একই ধরণের কলাম থাকতে হবে যা উল্লেখ করা হয়েছে
ড্যানিয়েল

9
এটি আমার জন্য কাজ করেছে - টেবিল-> স্বাক্ষরবিহীন বিগইন্টিজার ('ইউজার_আইডি');
ল্যাভারেলে

আমার সাথে এই সমস্যাটি ছিল 5.8, এটি আমার জন্য এটি স্থির! ধন্যবাদ!
মাইক শ্যাওয়ার্ড

দীর্ঘ রাত থেকে আমাকে বাঁচিয়েছে!
chq

19

আমার ক্ষেত্রে সমস্যাটি হ'ল মাইগ্রেশন সময় সম্পর্কে সতর্কতা অবলম্বন করতে হবে মাইগ্রেশন তৈরির সময় প্রথমে বেস মাইগ্রেশনের চেয়ে শিশু স্থানান্তর তৈরি করা। কারণ আপনি যদি প্রথমে বেস মাইগ্রেশন তৈরি করেন যা আপনার বিদেশী কী রয়েছে চাইল্ড টেবিলের সন্ধান করবে এবং সেখানে টেবিল থাকবে না যা পরে ব্যতিক্রম ছুঁড়ে ফেলবে।

আরও আরও:

আপনি যখন মাইগ্রেশন তৈরি করেন এটির শুরুতে এটির টাইমস্ট্যাম্প থাকে। যাক আপনি মাইগ্রেশন বিড়ালটি তৈরি করেছেন যাতে এটি দেখতে দেখতে এটির 2015_08_19_075954_the_cats_time.phpকোড থাকে

<?php

use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class TheCatsTime extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('cat', function (Blueprint $table) {
            $table->increments('id');
            $table->string('name');  
            $table->date('date_of_birth');
            $table->integer('breed_id')->unsigned()->nullable(); 
        });

        Schema::table('cat', function($table) {
        $table->foreign('breed_id')->references('id')->on('breed');
      });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::drop('cat');
    }
}

এবং বেস টেবিলটি তৈরি করার পরে আপনি অন্য স্থানান্তর জাতটি তৈরি করেন যা চাইল্ড টেবিল এটির নিজস্ব তৈরির সময় এবং তারিখ স্ট্যাম্প রয়েছে। কোডটি দেখতে পাবেন:

<?php

use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class BreedTime extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('breed', function (Blueprint $table) {
             $table->increments('id');    
             $table->string('name');
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::drop('breed');
    }
}

দেখে মনে হচ্ছে এই দুটি টেবিলটি সঠিক তবে আপনি পিএইচপি চালানোর সময় কারিগর মাইগ্রেট করবেন । এটি একটি ব্যতিক্রম ছুঁড়ে ফেলবে কারণ মাইগ্রেশনটি প্রথমে আপনার ডাটাবেজে বেস টেবিল তৈরি করবে কারণ আপনি এই মাইগ্রেশনটি প্রথম তৈরি করেছেন এবং আমাদের বেস টেবিলটিতে এটিতে বিদেশী কী বাধা রয়েছে যা চাইল্ড টেবিলটি সন্ধান করবে এবং শিশু টেবিলে উপস্থিত নেই যা সম্ভবত একটি ব্যতিক্রম..

তাই:

প্রথমে শিশু টেবিল স্থানান্তর তৈরি করুন।

শিশু স্থানান্তর তৈরি হওয়ার পরে বেস টেবিল স্থানান্তর তৈরি করুন।

পিএইচপি কারিগর মাইগ্রেশন।

এটি কাজ করবে


13

আমার ক্ষেত্রে আমি কেবল বদলানো অর্ডার মাইগ্রেশন ম্যানুয়ালি কার্যকর করা হয় যাতে টেবিল ব্যবহারকারীরা প্রথমে তৈরি হয়।

ফোল্ডার ডাটাবেসে / মাইগ্রেশনগুলিতে / আপনার স্থানান্তর ফাইলের এই ফর্ম্যাটটি রয়েছে: বছর_মাস্তে_দিন_হম্মসেস_ক্রিয়েট_এক্সএক্সএক্সএক্সএক্স_ট্যাব.পিপি

কেবলমাত্র ব্যবহারকারী ফাইল তৈরির পুনরায় নামকরণ করুন যাতে আপনার টেবিলের অগ্রাধিকার সারণির তৈরি তারিখটি ব্যবহারকারীর তারিখের চেয়ে পরে সেট করা হয় (এমনকি এক সেকেন্ড পরেও যথেষ্ট)


13

লারাভেল ৫.৮-তে, ব্যবহারকারী_সামগ্রী bigIncrements('id')প্রাথমিক কীটির জন্য ডেটা টাইপ ব্যবহার করে। যাতে আপনি যখন কোনও বিদেশী কী সীমাবদ্ধতা উল্লেখ করতে চান তখন আপনার user_idকলামটি unsignedBigInteger('user_id')টাইপ করা দরকার।


আপনাকে অনেক ধন্যবাদ, বিদেশী কী কী কারণে ব্যতিক্রম ঘটছে তা
ইয়া বাশা

10

লারাভেল ৫.৮ ব্যবহার করে আমার একই সমস্যা ছিল লারাভেল ডক্সকে ঘনিষ্ঠভাবে দেখার পরে, এখানে মাইগ্রেশন এবং বিগ আইক্রেনমেন্টস । আমি যেভাবে সমাধান করেছি তা হ'ল টেবিল "ব্যবহারকারী" এবং তার সহযোগীদের সাথে সম্পর্কিত প্রতিটি একক টেবিলের সাথে প্রাথমিক কী "" টেবিল-> বিগ আইক্রেনমেন্টস ('আইডি') " যুক্ত করা, আমার ক্ষেত্রে সারণী " ভূমিকা " । সবশেষে, ব্যবহারকারীর সাথে ভূমিকা রাখার জন্য "-টেবিল-> স্বাক্ষরবিহীন বিগইন্টিজার" ছিল (বহু থেকে বহু), এটি, টেবিল "ভূমিকা_user"

1. Users table

    Schema::create('users', function (Blueprint $table) {
            $table->bigIncrements('id');
            $table->string('name');
            $table->string('email')->unique();
            $table->timestamp('email_verified_at')->nullable();
            $table->string('password');
            $table->rememberToken();
            $table->timestamps();
        });

2. Roles Table
    Schema::create('roles', function (Blueprint $table) {
        $table->bigIncrements('id');
        $table->string('name')->unique();
        $table->string('display_name')->nullable();
        $table->string('description')->nullable();
        $table->timestamps();
    });

3. Table role_user
Schema::create('role_user', function (Blueprint $table) {
            $table->unsignedBigInteger('user_id');
            $table->unsignedBigInteger('role_id');
            $table->foreign('user_id')->references('id')->on('users')
                ->onUpdate('cascade')->onDelete('cascade');
            $table->foreign('role_id')->references('id')->on('roles')
                ->onUpdate('cascade')->onDelete('cascade');
            $table->primary(['user_id', 'role_id']);
        });

9

ল্যারাভেল ৫.৮ সহ আমার এই সমস্যাটি ছিল এবং লারাভেল ডকুমেন্টেশনে এখানে প্রদর্শিত হিসাবে আমি এই কোডটি স্থির করেছি , যেখানে আমি কোনও বিদেশী কী যুক্ত করছি am

$table->unsignedBigInteger('user_id');
$table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');

তাহলে আমি দৌড়ে গেলাম $ php artisan migrate:refresh

যেহেতু এই বাক্য গঠনটি বরং ভার্জোজ, লারাভেল একটি অতিরিক্ত বিকাশকারী পদ্ধতি সরবরাহ করে যা আরও উন্নত বিকাশের অভিজ্ঞতা সরবরাহের জন্য কনভেনশন ব্যবহার করে। উপরের উদাহরণটি এভাবে লেখা যেতে পারে:

Schema::table('posts', function (Blueprint $table) {
    $table->foreignId('user_id')->constrained()->onDelete('cascade');
});

7

লারাভেল 5.3 ব্যবহার করে একই সমস্যা ছিল।

সমাধানটি ছিল পূর্ণসংখ্যার ('নাম') -> স্বাক্ষরবিহীন () এর পরিবর্তে স্বাক্ষরবিহীন ইন্টিজার ব্যবহার করা ।

সুতরাং এই কি কাজ

$table->unsignedInt('column_name');
$table->foreign('column_name')->references('id')->on('table_name');

কারণ এই কাজ সত্য যে যখন ব্যবহার করছে > স্বাক্ষরবিহীন - পূর্ণসংখ্যা ( 'নাম') টেবিল তৈরি করা কলাম দৈর্ঘ্য 11 ছিল, কিন্তু ব্যবহার unsigedInteger ( 'নাম') কলাম দৈর্ঘ্য 10 ছিল।

লারাভেল ব্যবহার করার সময় প্রাইমারি কীগুলির দৈর্ঘ্য 10 তাই কলামগুলির দৈর্ঘ্য মিলে যায়।


মনুষ্য, আপনাকে ধন্যবাদ যে আমি আপনার পোস্টটি সন্ধানের সাথে সাথে কাঁচা এসকিএল ছেড়ে দিয়ে চলেছিলাম। লারাভেল প্রাইমারী কীটি 10 ​​এর দৈর্ঘ্যের হতে বাধ্য হয় এবং এর জন্য যদি কোনও কারণ থাকে তবে ('কলাম') -> স্বাক্ষরযুক্ত () আনসিজেডইন্টার ('কলাম') থেকে আলাদা হওয়া উচিত
আরনাউড সম্পর্কে আরও

6

এই ত্রুটিটি আমার জন্য ঘটেছিল কারণ - আমি যে টেবিলটি তৈরি করার চেষ্টা করছিলাম সেটি ছিল ইনোডিবি - আমি যে বিদেশী টেবিলটি এটির সাথে সম্পর্কিত করার চেষ্টা করছিলাম সেটি ছিল মাইআইএসএএম টেবিল!


মাইআইএসএএম বিদেশী কী বাধাগুলি সমর্থন করে না। এটি সম্ভবত কাজ করেছিল কারণ মাইআইএসএএম-এ স্যুইচ করার কারণে এটি সম্ভবত কোনও কারণে বিদেশী কীটি সম্পূর্ণরূপে উপেক্ষা করেছিল। সতর্ক হোন.
গ্রেগল 138

5

আমরা সম্পর্ক যুক্ত করতে পারি না, যদি না সম্পর্কিত সারণী তৈরি না হয়। লারাভেল মাইগ্রেশন ফাইলের তারিখ অনুসারে মাইগ্রেশন পরিচালনা করে। সুতরাং আপনি যদি কোনও টেবিলের সাথে সম্পর্ক তৈরি করতে চান যা ২ য় মাইগ্রেশন ফাইলে বিদ্যমান থাকে তবে এটি ব্যর্থ হয়।

আমি একই সমস্যার মুখোমুখি হয়েছি, তাই আমি সমস্ত সম্পর্ক নির্দিষ্ট করার জন্য শেষ পর্যন্ত আরও একটি মাইগ্রেশন ফাইল তৈরি করেছি।

Schema::table('properties', function(Blueprint $table) {
        $table->foreign('user')->references('id')->on('users')->onDelete('cascade');
        $table->foreign('area')->references('id')->on('areas')->onDelete('cascade');
        $table->foreign('city')->references('id')->on('cities')->onDelete('cascade');
        $table->foreign('type')->references('id')->on('property_types')->onDelete('cascade');
    });

    Schema::table('areas', function(Blueprint $table) {
        $table->foreign('city_id')->references('id')->on('cities')->onDelete('cascade');
    });

1
আপনি ফাইলটির নাম কি দিয়েছিলেন? 9999_99_99_999999_create_foreign_keys.php?
ইন্নাজি

মাইগ্রেশন ফাইলনামে 9999_99_99_99999 যুক্ত করা খারাপ ধারণা কারণ এটি রোলব্যাক বৈশিষ্ট্যটি স্ক্রু করবে।
মৌলিক গাঙ্গানি

5

সচেতন হন: যখন লারাভেল ব্যবহার করে একটি সারণী সেট আপ করে

$table->increments('id');

যা বেশিরভাগ মাইগ্রেশনে স্ট্যান্ডার্ড, এটি একটি স্বাক্ষরবিহীন পূর্ণসংখ্যার ক্ষেত্র স্থাপন করবে। সুতরাং এই ক্ষেত্রের অন্য টেবিল থেকে বৈদেশিক রেফারেন্স তৈরি করার সময়, নিশ্চিত করুন যে রেফারেন্সিং সারণিতে আপনি ক্ষেত্রটি আনসাইনডইনটেজারে সেট করেছেন এবং না (আমি কী হিসাবে ধরে নিলাম) সাইনডবিগইন্টিজার ক্ষেত্রটি স্থাপন করেছি।

উদাহরণস্বরূপ: মাইগ্রেশন ফাইলে 2018_12_12_123456_Create_users_table.php:

Schema::create('users', function (Blueprint $table){
    $table->increments('id');
    $table->string('name');
    $table->timestamps();

তারপরে মাইগ্রেশন ফাইলে 2018_12_12_18000000_create_perifications_table.php, যা ব্যবহারকারীদের কাছে বিদেশী রেফারেন্স সেট আপ করে:

Schema::create('permissions', function (Blueprint $table){
    $table->increments('id');
    $table->UnsignedInteger('user_id'); // UnsignedInteger = "increments" in users table
    $table->boolean('admin');
    $table->boolean('enabled');
    $table->timestamps();

    // set up relationship
    $table->foreign('user_id')->reference('id')->on('users')->onDelete('cascade');
}

5

আপনার এইভাবে লেখা উচিত

public function up()
{
    Schema::create('transactions', function (Blueprint $table) {
        $table->bigIncrements('id');
        $table->float('amount', 11, 2);
        $table->enum('transaction type', ['debit', 'credit']);
        $table->bigInteger('customer_id')->unsigned();      
        $table->timestamps();                 
    });

    Schema::table('transactions', function($table) {
        $table->foreign('customer_id')
              ->references('id')->on('customers')
              ->onDelete('cascade');
    });     
}

বিদেশী কী ক্ষেত্রটি স্বাক্ষরিত হওয়া উচিত , আশা করি এটি সাহায্য করবে !!


শুধু স্বাক্ষরবিহীন নয় তবে যখন এটি একটি বড়সড় কলামের রেফারেন্স দেয় তখন এটি আনসিজড হওয়া উচিত বিগইন্টিজার
gondwe

4

লারাভেলে বিদেশী কী বাধা যুক্ত করার জন্য, নিম্নলিখিতগুলি আমার জন্য কাজ করেছে:

  1. বিদেশী কী হিসাবে কলামটি নীচে তৈরি করুন:

    $ Table-> পূর্ণসংখ্যা ( 'COLUMN_NAME') -> স্বাক্ষরবিহীন ();
  2. অবিলম্বে (1) এর পরে বাধা লাইন যুক্ত করা হচ্ছে

    $ Table-> পূর্ণসংখ্যা ( 'COLUMN_NAME') -> স্বাক্ষরবিহীন ();
    $ Table-> বিদেশী ( 'COLUMN_NAME') -> রেফারেন্স ( 'pk_of_other_table') -> উপর ( 'other_table');

3

আমি জানি একটি পুরানো প্রশ্ন রয়েছে তবে আপনি যদি রেফারেন্স সহ কাজ করছেন তবে সঠিক সমর্থনকারী ইঞ্জিনটি সংজ্ঞায়িত হয়েছে কিনা তা নিশ্চিত করুন। উভয় সারণী এবং রেফারেন্স কলামগুলির জন্য একই ডেটা টাইপের জন্য ইনডোডব ইঞ্জিন সেট করুন

$table->engine = 'InnoDB';

2

মূল প্রশ্নটির কয়েক বছর পরে এখানে চিমিং, লারাভেল ৫.১ ব্যবহার করে, আমার মাইগ্রেশনগুলি একই তারিখের কোড সহ কম্পিউটার তৈরির মতোই আমার ত্রুটি হয়েছিল। আমি প্রস্তাবিত সমস্ত সমাধান দিয়েছি, তারপরে ত্রুটির উত্সটি সন্ধান করতে রিফ্যাক্টর করেছি।

নিম্নলিখিত ল্যারেস্টগুলিতে এবং এই পোস্টগুলি পড়ার পরে, আমি বিশ্বাস করি যে সঠিক উত্তরটি ভিকি উত্তরগুলির সাথে সমান, ব্যতিক্রম ছাড়া আপনার আলাদা স্কিমা কল যুক্ত করার দরকার নেই। আপনাকে ইনোডব-এ টেবিলটি সেট করার দরকার নেই, আমি ধরে নিচ্ছি লারাভেল এখন এটি করছে।

মাইগ্রেশনগুলিকে কেবল সঠিকভাবে সময় নির্ধারণ করা প্রয়োজন, যার অর্থ আপনি যে টেবিলগুলির জন্য বিদেশী কী প্রয়োজন সেগুলি জন্য ফাইলনামে তারিখের কোডটি (পরে) সংশোধন করবেন। বিকল্প বা অতিরিক্ত হিসাবে, বিদেশী কীগুলির প্রয়োজন নেই এমন টেবিলগুলির জন্য ডেটকোডটি কম করুন।

ডেটকোড সংশোধন করার সুবিধাটি হ'ল আপনার মাইগ্রেশন কোডটি পড়া এবং বজায় রাখা সহজ হবে।

এখন পর্যন্ত আমার কোডগুলি বিদেশী কীগুলির প্রয়োজন মাইগ্রেশনগুলিকে পিছনে ঠেলে সময় কোড সামঞ্জস্য করে কাজ করছে।

তবে আমার কাছে কয়েকশ টেবিল রয়েছে, তাই খুব শেষে আমার কাছে কেবল বিদেশী কীগুলির জন্য একটি শেষ টেবিল রয়েছে। শুধু জিনিস প্রবাহিত পেতে। আমি ধরে নিচ্ছি যে আমি সেগুলি সঠিক ফাইলে টানবো এবং ডেটকোডটি তাদের পরীক্ষা করার সাথে সাথে সংশোধন করব।

সুতরাং একটি উদাহরণ: ফাইল 2016_01_18_999999_Create_product_options_table। এটি তৈরির জন্য পণ্যগুলির টেবিলটি প্রয়োজন। ফাইল নাম দেখুন।

 public function up()
{
    Schema::create('product_options', function (Blueprint $table) {
        $table->increments('id');
        $table->integer('product_attribute_id')->unsigned()->index();
        $table->integer('product_id')->unsigned()->index();
        $table->string('value', 40)->default('');
        $table->timestamps();
        //$table->foreign('product_id')->references('id')->on('products');
        $table->foreign('product_attribute_id')->references('id')->on('product_attributes');
        $table->foreign('product_id')->references('id')->on('products');


    });
}

/**
 * Reverse the migrations.
 *
 * @return void
 */
public function down()
{
    Schema::drop('product_options');
}

পণ্য সারণী: এটি প্রথম স্থানান্তরিত করা প্রয়োজন। 2015_01_18_000000_create_products_table

public function up()
{
    Schema::create('products', function (Blueprint $table) {
        $table->increments('id');

        $table->string('style_number', 64)->default('');
        $table->string('title')->default('');
        $table->text('overview')->nullable();
        $table->text('description')->nullable();


        $table->timestamps();
    });
}

/**
 * Reverse the migrations.
 *
 * @return void
 */
public function down()
{
    Schema::drop('products');
}

এবং অবশেষে ফাইলগুলি আমি সাময়িকভাবে সমস্যার সমাধানের জন্য ব্যবহার করছি সেই ফাইলটি, যা আমি 9999_99_99_999999_create_foreign_keys.php নাম রেখেছি এমন মডেলগুলির জন্য পরীক্ষাগুলি লেখার সাথে সাথে আমি রিফ্যাক্টর করব। এই কীগুলি আমি টেনে আনার সাথে সাথে মন্তব্য করা হয়েছে তবে আপনি পয়েন্টটি পেয়ে গেছেন।

    public function up()
    {
//        Schema::table('product_skus', function ($table) {
//            $table->foreign('product_id')->references('id')->on('products')->onDelete('cascade');
//    });

    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
//        Schema::table('product_skus', function ($table)
//        {
//            $table->dropForeign('product_skus_product_id_foreign');
//        });

2

খুবই সোজা !!!

যদি আপনার প্রথম 'priorities'মাইগ্রেশন ফাইল তৈরি হয় , লারভেল প্রথমে রান করুন 'priorities'যখন 'users'টেবিলের অস্তিত্ব নেই।

এটি কোনও টেবিলের সাথে কীভাবে সম্পর্ক যুক্ত করতে পারে যা বিদ্যমান নেই!

সমাধান: সারণী থেকে বিদেশী কী কোডগুলি টেনে আনুন। আপনার মাইগ্রেশন ফাইলটি এমন হওয়া উচিত:'priorities'

এখানে চিত্র বর্ণনা লিখুন

এবং একটি নতুন মাইগ্রেশন ফাইল যুক্ত করুন, এর নাম এখানে রয়েছে create_prioritiesForeignKey_tableএবং এই কোডগুলি যুক্ত করুন:

public function up()
{        
    Schema::table('priorities', function (Blueprint $table) {          
        $table->foreign('user_id')
              ->references('id')
              ->on('users');                        
    });
}

2

আপনার foreing কলামটি ফোরিং কী কলামটির বিস্তৃত ক্রোধের চেয়ে বেশি রয়েছে তা নিশ্চিত করুন

মানে আপনার ফরঙ্গকি (দ্বিতীয় সারণীতে) অবশ্যই আপনার পন্টার প্রসিপাল কী (প্রথম টেবিলের) মধ্যে একই ধরণের হতে হবে

আপনার পয়েন্টার মূল কীটি অবশ্যই স্বাক্ষরবিহীন পদ্ধতি যুক্ত করা উচিত, আমাকে দেখাতে দাও:

আপনার প্রথম স্থানান্তর টেবিলে:

$table->increments('column_name'); //is INTEGER and UNSIGNED

আপনার SECOND মাইগ্রেশন টেবিলে:

$table->integer('column_forein_name')->unsigned(); //this must be INTEGER and UNSIGNED
$table->foreign('column_forein_name')->references('column_name')->on('first_table_name');

ভিন্নতা দেখার জন্য অন্য উদাহরণ

আপনার প্রথম স্থানান্তর টেবিলে:

$table->mediumIncrements('column_name'); //is MEDIUM-INTEGER and UNSIGNED

আপনার SECOND মাইগ্রেশন টেবিলে:

$table->mediumInteger('column_forein_name')->unsigned(); //this must be MEDIUM-INTEGER and UNSIGNED
$table->foreign('column_forein_name')->references('column_name')->on('first_table_name');

মাইএসকিউএল ম্যাসেরিক টাইপ টেবিলে রেঞ্জগুলি দেখুন


2

একটি জিনিস আমি লক্ষ্য করেছি যে টেবিলগুলি বিদেশী কী সীমাবদ্ধতার চেয়ে আলাদা ইঞ্জিন ব্যবহার করে।

উদাহরণস্বরূপ, যদি একটি টেবিল ব্যবহার করে:

$table->engine = 'InnoDB';

এবং অন্যান্য ব্যবহার

$table->engine = 'MyISAM';

একটি ত্রুটি উত্পন্ন করবে:

SQLSTATE[HY000]: General error: 1215 Cannot add foreign key constraint

আপনি আপনার টেবিল তৈরির শেষে কেবল ইনোডিবি যুক্ত করে এটি ঠিক করতে পারেন:

public function up()
{
    Schema::create('users', function (Blueprint $table) {
        $table->bigIncrements('id');
        $table->unsignedInteger('business_unit_id')->nullable();

        $table->string('name', 100);

        $table->foreign('business_unit_id')
                ->references('id')
                ->on('business_units')
                ->onDelete('cascade');

        $table->timestamps();
        $table->softDeletes();
        $table->engine = 'InnoDB'; # <=== see this line
    });
}

1

আমার ক্ষেত্রে, আমি একটি স্ট্রিং কলামে একটি পূর্ণসংখ্যা id কলাম উল্লেখ করছি । আমি বদলে গেছি: user_id

$table->string('user_id')

প্রতি:

$table->integer('user_id')->unsigned();

আশা করি এটি কাউকে সাহায্য করবে!


1

সংক্ষেপে হ'ল বিদেশী পদ্ধতিটি ALTER_TABLEপ্রাক-বিদ্যমান ক্ষেত্রটিকে একটি বিদেশী কী হিসাবে তৈরি করতে ব্যবহার করে। সুতরাং বিদেশী কী প্রয়োগ করার আগে আপনাকে টেবিলের ধরণটি নির্ধারণ করতে হবে। তবে এটি আলাদা Schema::কল করতে হবে না । আপনি তৈরির মধ্যে উভয়ই এটি করতে পারেন:

public function up()
{
    Schema::create('priorities', function($table) {
        $table->increments('id', true);
        $table->integer('user_id')->unsigned();
        $table->foreign('user_id')->references('id')->on('users');
        $table->string('priority_name');
        $table->smallInteger('rank');
        $table->text('class');
        $table->timestamps('timecreated');
    });
}

এছাড়াও নোট করুন যে প্রকারটি user_idবিদেশী কীটির সাথে মেলে স্বাক্ষরবিহীন সেট করা আছে।


1

আপনি সরাসরি ইন্টিজার কলামে বুলিয়ান প্যারামিটারটি পাস করে বলতে পারেন যে এটি স্বাক্ষরিত হওয়া উচিত কিনা। লার্যাভেল 5.4 এ নিম্নলিখিত কোডটি আমার সমস্যার সমাধান করেছে।

        $table->integer('user_id', false, true);

এখানে দ্বিতীয় প্যারামিটার মিথ্যাটি উপস্থাপন করে যে এটি স্বতঃবৃদ্ধিযোগ্য হওয়া উচিত নয় এবং তৃতীয় পরামিতি সত্য উপস্থাপন করে যে এটি স্বাক্ষরবিহীন হওয়া উচিত। আপনি একই স্থানান্তরে বিদেশী কী সীমাবদ্ধতা রাখতে পারেন বা এটিকে পৃথক করতে পারেন। এটি উভয় উপর কাজ করে।


1

উভয় আইডির একই ধরণের আছে কিনা তা চেক করে নবাবিদের জন্য উপরের সমাধানগুলির কোনওটি যদি কাজ করে না: উভয়ই হয় integerবা উভয়ইbigInteger , ... আপনার এর মতো কিছু থাকতে পারে:

প্রধান সারণী (উদাহরণস্বরূপ ব্যবহারকারী)

$table->bigIncrements('id');

শিশু ছক (উদাহরণস্বরূপ অগ্রাধিকার)

$table->unsignedInteger('user_id');
$table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');

এই কুয়েরি ব্যর্থ কারণ users.idএকটি BIG INTEGERযেহেতু priorities.user_idএকটি হল INTEGER

এই ক্ষেত্রে সঠিক জিজ্ঞাসাটি নিম্নলিখিত হবে:

$table->unsignedBigInteger('user_id');
$table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');

1

আমার ক্ষেত্রে এটি কমান্ড চালানো অবধি কার্যকর হয়নি

composer dump-autoload

আপনি স্কেমা তৈরির ভিতরে বিদেশী কীগুলি রেখে যেতে পারেন

public function up()
{
    //
     Schema::create('priorities', function($table) {
        $table->increments('id', true);
        $table->integer('user_id');
        $table->foreign('user_id')->references('id')->on('users');
        $table->string('priority_name');
        $table->smallInteger('rank');
        $table->text('class');
        $table->timestamps('timecreated');
    });
 }

 /**
 * Reverse the migrations.
 *
 * @return void
 */
public function down()
{
    //
    Schema::drop('priorities');
}

1

এটি আপনার সৃষ্টির স্থানান্তরের ক্রমও হতে পারে। আপনি যদি প্রথমত অগ্রাধিকার টেবিল তৈরি করেন এবং ব্যবহারকারীদের সারণির পরে এটি ভুল হবে। কারণ প্রথম মাইগ্রেশন ব্যবহারকারীদের সারণির সন্ধান করছে। সুতরাং, আপনাকে স্থানান্তরের ক্রমটি পরিবর্তন করতে হবে

app/database/migrations

ডিরেক্টরি


1

আমার জন্য, আমার সন্তানের টেবিলটি যে সারণী কলামটি উল্লেখ করেছে তা সূচিযুক্ত হয়নি।

Schema::create('schools', function (Blueprint $table) {
    $table->integer('dcid')->index()->unque();
    $table->integer('school_number')->index(); // The important thing is that this is indexed
    $table->string('name');
    $table->string('abbreviation');
    $table->integer('high_grade');
    $table->integer('low_grade');
    $table->timestamps();
    $table->primary('dcid');
});

Schema::create('students', function (Blueprint $table) {
      $table->increments('id');
      $table->integer('dcid')->index()->unique()->nullable();
      $table->unsignedInteger('student_number')->nullable();
      $table->integer('schoolid')->nullable();
      $table->foreign('schoolid')->references('school_number')->on('schools')->onDelete('set null');
      // ...
});

ভয়ানক নামকরণ উপেক্ষা করুন, এটি অন্য এক ভয়ঙ্করভাবে ডিজাইন করা সিস্টেম from


1

স্থানান্তরগুলির ক্রমগুলির কারণে কিছু সময় এই ত্রুটিটি আসতে পারে।

ব্যবহারকারী এবং আদেশ দুটি টেবিলের মত

অর্ডার টেবিলটিতে ব্যবহারকারীদের কী কী রয়েছে (মাইগ্রেশন চলাকালীন যদি প্রথমে অর্ডার টেবিলটি স্থানান্তরিত হয় তবে এটি সমস্যার কারণ হবে কারণ বিদেশী কীটির সাথে মেলে কোনও ব্যবহারকারী নেই)

সমাধান: আপডেটের জন্য কেবলমাত্র আপনার অর্ডার আপডেট টেবিলটি ব্যবহারকারীদের নীচে রাখুন

উদাহরণ: আমার ক্ষেত্রে শিক্ষা এবং বিশ্ববিদ্যালয় সারণি শিক্ষার সারণী

public function up()
{
    Schema::create('doc_education', function (Blueprint $table) {
        $table->increments('id');
        $table->integer('uni_id')->unsigned()->nullable();
        $table->timestamps();
    });
}

ইউনিভার্সিটিতে

    Schema::create('doc_universties', function (Blueprint $table) {
        $table->increments('id');
        $table->string('uni_name');
        $table->string('location')->nullable();
        $table->timestamps();

        //
    });



Schema::table('doc_education', function(Blueprint $table) {
        $table->foreign('uni_id')->references('id')
        ->on('doc_universties')->onDelete('cascade');
    });

0

আমি মনে করি যে একটি জিনিস এখানে উত্তরগুলি অনুপস্থিত, এবং দয়া করে আমি ভুল হলে আমাকে সংশোধন করুন, তবে বিদেশী কীগুলি পিভট টেবিলে সূচীকরণ করা দরকার। অন্তত মাইএসকিএল-তে এটি মনে হয়।

public function up()
{
    Schema::create('image_post', function (Blueprint $table) {
        $table->engine = 'InnoDB';
        $table->increments('id');
        $table->integer('image_id')->unsigned()->index();
        $table->integer('post_id')->unsigned()->index();
        $table->timestamps();
    });

    Schema::table('image_post', function($table) {
        $table->foreign('image_id')->references('id')->on('image')->onDelete('cascade');
        $table->foreign('post_id')->references('id')->on('post')->onDelete('cascade');
    });

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