लारवेल स्कीमा onDelete सेट नल


112

लारवेल में एक मेज पर उचित onDelete बाधा सेट करने के लिए कैसे पता नहीं कर सकते। (मैं SqLite के साथ काम कर रहा हूँ)

$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
});

मुझे कोई त्रुटि नहीं मिलती है। इसके अलावा, यहां तक ​​कि "कैस्केड" विकल्प भी काम नहीं करता है (केवल गैलरी टेबल पर)। गैलरी हटाने से सभी चित्र हट जाते हैं। लेकिन कवर तस्वीर को हटाना, गैलरी को हटाना नहीं होगा (परीक्षण प्रयोजनों के लिए)।

चूंकि "कैस्केड" को भी ट्रिगर नहीं किया गया है, इसलिए मुझे "सेट नल" समस्या नहीं है।

EDIT (वर्कअराउंड):

इस लेख को पढ़ने के बाद मैंने अपना स्कीमा थोड़ा बदल दिया है। अब, चित्र तालिका में एक "is_cover" सेल है, जो इंगित करता है कि यह चित्र उसके एल्बम पर एक कवर है या नहीं।

मूल समस्या का समाधान अभी भी बहुत सराही जाती है!

जवाबों:


317

यदि आप हटाना चाहते हैं:

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

पहले सुनिश्चित करें कि आपने विदेशी कुंजी फ़ील्ड को अशक्त के रूप में सेट किया है:

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

37
प्लस फॉर->nullable()
mohsenJsh

3
वहाँ कुछ लारवेल प्रलेखन ओ यह है?
चक ले बट

laravel.com/docs/6.x/migrations#foreign-key-constraints यह दस्तावेज़ नहीं है कि क्या विकल्प हैं, लेकिन मुझे लगता है कि आप मान सकते हैं कि यह डिफ़ॉल्ट mysql मान है (देखें ../ vendor / laravel / framework / src / Illuminate / Database / Schema / Grammars / Grammar.php)
Dirk Jan

6
  • यह लारवेल में एक ज्ञात मुद्दा है। इसके बारे में अधिक जानकारी यहाँ

  • यह सुविधा SQLite में समर्थित नहीं है, यहां देखें

  • साथ ही एक विषय जिसमें इस समस्या का विस्तृत प्रदर्शन है


1
@SimonBengtsson समस्या बंद या हटा दी गई होनी चाहिए।
एमके

5

इसके अनुसार

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

$ तालिका-> onDelete ('सेट नल') को प्रैप्स की कोशिश करनी चाहिए

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

यदि कोई त्रुटि है, तो भी मददगार होगा


आप वापस रोल करना चाहते हैं, हाथ से sql लिख सकते हैं और फिर स्थानीय पर परीक्षण और परीक्षण चला सकते हैं। मुझे जो कुछ भी मिल सकता है वह कहता है कि dev.mysql.com/doc/refman/5.6/en/… पर काम करना चाहिए , sql पैदा करने वाला मुद्दा हो सकता है
क्रिस बैरेट

धन्यवाद! दुर्भाग्य से यह एक ही मुद्दे के परिणामस्वरूप हुआ। मुझे लगता है कि यह SqLite और परिपत्र संदर्भों के लिए कुछ विशिष्ट है।
एमके

प्लस वन क्योंकि ओटेलीट ('सेट नल') mysql के साथ काम करता है।
साइमन बेंग्सटन

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.