मेरी एक टेबल के लिए सीडर विफल हो रहा है

रोशनी \ डेटाबेस \ QueryException: SQLSTATE [HY000]: सामान्य त्रुटि: 1364 फ़ील्ड 'आईडी' का कोई डिफ़ॉल्ट मान नहीं है (एसक्यूएल: इसमें डालें tests (name, description, panel_id, units, minValue, lowNote, maxValue, highNote, note_id) मान (ए/जी अनुपात, एल्बुमिन से ग्लोब्युलिन अनुपात, 2, , 1.2, , 2.5, , 1))

ध्यान दें कि id फ़ील्ड को छोड़ा जा रहा है?

माइग्रेशन की up() विधि यहां दी गई है:

public function up()
{
    Schema::create('tests', function (Blueprint $table) {
        $table->unsignedBigInteger('id');
        $table->string('name');
        $table->string('description');
        $table->unsignedBigInteger('panel_id');
        $table->string('units');
        $table->string('minValue');
        $table->string('lowNote',512);
        $table->string('maxValue');
        $table->string('highNote',512);
        $table->unsignedBigInteger('note_id');
    });
}

यहाँ TestSeeder::run() विधि का हिस्सा है:

$tests = [
    [
        'id' => 1,
        'name' => 'A/G Ratio',
        'description' => 'Albumin to Globulin Ratio',
        'panel_id' => 2,
        'units' => '',
        'minValue' => '1.2',
        'lowNote' => '',
        'maxValue' => '2.5',
        'highNote' => '',
        'note_id' => 1
    ],
];

यहाँ Test मॉडल है:

class Test extends Model
{
    public $timestamps = false;
    protected $fillable = [
    'id',
    'name',
    'description',
    'panel_id',
    'units',
    'minValue',
    'lowNote',
    'maxValue',
    'high_note',
    'note_id'
    ];
}

ध्यान दें कि id फ़ील्ड $fillable सरणी में सूचीबद्ध है, तो इसे क्यों छोड़ा जा रहा है?

0
user3217883 30 मार्च 2020, 01:27
2
कोड के भाग को छोड़कर, हमें कोड के पूर्ण ब्लॉक की आवश्यकता है कि आप डीबी में डेटा कैसे सम्मिलित करते हैं। अपना प्रश्न संपादित करें और टेस्टसीडर :: रन () विधि का पूरा ब्लॉक डालें जो डेटा डालने के लिए ज़िम्मेदार है। साथ ही, यदि लागू हो तो $table->bigIncrements('id'); का उपयोग करना उचित होगा।
 – 
Tpojka
30 मार्च 2020, 02:24

2 जवाब

लैरावेल अन्य स्तंभों की तुलना में प्राथमिक कुंजी के रूप में अलग-अलग व्यवहार करता है। चूंकि आपने अपने माइग्रेशन में कॉलम को गलत तरीके से परिभाषित किया है, इसलिए यह विफल हो रहा है। इसके बजाय इसका उपयोग करने का प्रयास करें:

public function up()
{
    Schema::create('tests', function (Blueprint $table) {
        $table->id();
        $table->foreignId('panel_id')->constrained();
        $table->foreignId('note_id')->constrained();
        // ...
    }
}

यह एक id कॉलम तैयार करेगा जो ऑटो-इन्क्रीमेंट करता है और तालिका की प्राथमिक कुंजी के रूप में कॉन्फ़िगर किया गया है। यह स्वचालित रूप से लिंक करने के लिए विदेशी कुंजियों को परिभाषित भी करेगा। अन्य टेबल।


मैं मान रहा हूँ कि आप Laravel के नवीनतम संस्करण का उपयोग कर रहे हैं - ये फ़ंक्शन Laravel 7.0 में पेश किए गए थे। यदि आप अभी भी Laravel 6.x का उपयोग कर रहे हैं तो यह माइग्रेशन वही काम करता है, बस और अधिक क्रियात्मक रूप से:

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

        $table->unsignedBigInteger('panel_id');
        $table->foreign('panel_id')->references('id')->on('panels');

        $table->unsignedBigInteger('note_id');
        $table->foreign('note_id')->references('id')->on('notes');
        // ...
    }
}
0
miken32 30 मार्च 2020, 05:01
मैं Laravel 6.14.0 का उपयोग कर रहा हूं इसलिए मैंने आपका निचला कोड लागू किया। अब मुझे निम्न त्रुटि मिलती है: "Illuminate\Database\QueryException: SQLSTATE[42000]: सिंटैक्स त्रुटि या पहुंच उल्लंघन: 1068 एकाधिक प्राथमिक कुंजी परिभाषित (एसक्यूएल: तालिका बदलें tests प्राथमिक कुंजी जोड़ें tests_id_primary(id))"
 – 
user3217883
30 मार्च 2020, 03:03
ऐसा लगता है कि स्पष्ट बात यह है कि प्राथमिक कुंजी जोड़ने वाली रेखा को हटाना है। मैंने जवाब संपादित कर लिया है।
 – 
miken32
30 मार्च 2020, 05:03
हां, मैंने वह किया और अब मैं वापस वहीं आ गया हूं जहां मैंने मूल समस्या के साथ शुरुआत की थी। यह कि सीडर होने के कारण मैं उस आईडी की उपेक्षा करता हूं जिसे मैं उपयोग करने के लिए कहता हूं और इसके बजाय अपने स्वयं के ऑटो-इंक्रीमेंट नंबर का उपयोग करता है। यही कारण है कि मैंने आईडी प्रकार को bigIncrements से unsignedBigInteger में बदल दिया था, उम्मीद है कि यह बीजक को मेरे द्वारा दी गई चीज़ों का उपयोग करने के लिए मजबूर करेगा। लेकिन ऐसा नहीं हुआ।
 – 
user3217883
30 मार्च 2020, 16:55
आपको शायद अपने प्रश्न में इसका उल्लेख करना चाहिए था।
 – 
miken32
30 मार्च 2020, 17:20

आपको इस लाइन को बदलने की जरूरत है:

$table->unsignedBigInteger('id');

प्रति:

$table->bigIncrements('id');
1
Hamza Makraz 30 मार्च 2020, 05:04