ল্যারাভেল স্কিমা অন-ডিলিট সেটটি বাতিল


112

লারাভেলের কোনও টেবিলে কীভাবে যথাযথ অন ডিলিট সীমাবদ্ধতা সেট করবেন তা নির্ধারণ করতে পারছেন না। (আমি স্ক্লাইটের সাথে কাজ করছি)

$table->...->onDelete('cascade'); // works
$table->...->onDelete('null || set null'); // neither of them work

গ্যালারী টেবিল তৈরি করে আমার কাছে 3 টি মাইগ্রেশন রয়েছে:

Schema::create('galleries', function($table)
{
    $table->increments('id');
    $table->string('name')->unique();
    $table->text('path')->unique();
    $table->text('description')->nullable();
    $table->timestamps();
    $table->engine = 'InnoDB';
});

ছবির টেবিল তৈরি করা:

Schema::create('pictures', function($table)
{
    $table->increments('id');
    $table->text('path');
    $table->string('title')->nullable();
    $table->text('description')->nullable();
    $table->integer('gallery_id')->unsigned();
    $table->foreign('gallery_id')
        ->references('id')->on('galleries')
        ->onDelete('cascade');
    $table->timestamps();
    $table->engine = 'InnoDB';
});

একটি ছবির সাথে গ্যালারী টেবিলের লিঙ্ক:

Schema::table('galleries', function($table)
{
    // id of a picture that is used as cover for a gallery
    $table->integer('picture_id')->after('description')
        ->unsigned()->nullable();
    $table->foreign('picture_id')
        ->references('id')->on('pictures')
        ->onDelete('cascade || set null || null'); // neither of them works
});

আমি কোনও ত্রুটি গ্রহণ করি না। এছাড়াও, "ক্যাসকেড" বিকল্পটিও কাজ করে না (কেবল গ্যালারী টেবিলের উপরে)। একটি গ্যালারী মোছা সমস্ত ছবি মুছে দেয়। তবে কভার ছবি মুছে ফেলা, গ্যালারীটি (পরীক্ষার উদ্দেশ্যে) মুছবে না।

যেহেতু "ক্যাসকেড "টিও ট্রিগার করা হয়নি, তাই আমি" সেট নাল "সমস্যা নয়।

সম্পাদনা (কার্যনির্বাহী):

এই নিবন্ধটি পড়ার পরে আমি আমার স্কিমাটি কিছুটা পরিবর্তন করেছি। এখন, ছবিগুলির সারণিতে একটি "is_cover" সেল রয়েছে যা নির্দেশ করে যে এই ছবিটি তার অ্যালবামের একটি কভার কিনা or

মূল সমস্যার একটি সমাধান এখনও অত্যন্ত প্রশংসা করা হয়!

উত্তর:


317

আপনি যদি মুছে ফেলতে বাতিল করতে চান:

$table->...->onDelete('set null');

প্রথমে নিশ্চিত হয়ে নিন যে আপনি বিদেশী কী ক্ষেত্রটিকে শর্তযুক্ত হিসাবে সেট করেছেন:

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

37
প্লাস এর জন্য->nullable()
mohsenJsh

3
ওখানে কিছু লারাভেল ডকুমেন্টেশন আছে কি?
চক লে বাট

laravel.com/docs/6.x/migration#foreign-key- কনট্রেন্টগুলি এটি কোন বিকল্পগুলি রয়েছে তা দলিল করে না, তবে আমি মনে করি আপনি এটি ডিফল্ট মাইএসকিএল মানগুলি (দেখুন ../ vendor / laravel / framework / src / Illuminate / Database / Schema / Grammars / Grammar.php) ধরে নিতে পারেন
ডার্ক জানুয়ার

6
  • এটি লারাভেলের একটি পরিচিত সমস্যা। এখানে এই সম্পর্কে আরও তথ্য ।

  • এই বৈশিষ্ট্যটি এসকিউএলাইটে সমর্থিত নয়, এখানে দেখুন

  • এছাড়াও একটি বিষয় যা এই সমস্যার বিশদ শোডাউন করে


1
@ সিমোনবেংটসন এই সমস্যাটি অবশ্যই বন্ধ বা মুছে ফেলা হয়েছে।
এমকে

5

অনুসারে

http://dev.mysql.com/doc/refman/5.6/en/innodb-foreign-key-constraints.html

$ টেবিল-> অন - ডিলিট ('সেট নাল') কাজ করা উচিত প্রাক চেষ্টা করার চেষ্টা করুন

$table->...->onDelete(DB::raw('set null'));

যদি কোনও ত্রুটি থাকে তবে এটি সহায়কও হবে


আপনি ফিরে রোল করতে পারেন, হাতে স্ক্যুয়াল লিখুন এবং তারপরে এক্সটেকচার এবং স্থানীয় পরীক্ষা চালাতে পারেন। আমি যা কিছু খুঁজে পেতে পারি সেগুলি বলে যা dev.mysql.com/doc/refman/5.6/en/… কাজ করা উচিত , স্ক্যুয়াল তৈরির সমস্যা হতে পারে
ক্রিস ব্যারেট

ধন্যবাদ! দুর্ভাগ্যক্রমে এটি একই সমস্যার ফলস্বরূপ। আমি মনে করি এটি স্কাইলাইট এবং বিজ্ঞপ্তি সংক্রান্ত উল্লেখগুলির সাথে নির্দিষ্ট।
এম কে

প্লাস ওয়ান কারণ অনডিলিট ('সেট নাল') মাইএসকিএল নিয়ে কাজ করে।
সাইমন বেঙ্গস্টসন

3

ইনোডিবি দিয়ে মাইএসকিউএল 5.5 এ লারাভেল 4.2 ব্যবহার করে, অনডিলিট ('নাল সেট করুন') কাজ করে।

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