लारवेल 5.2 - एलोकेंट टेबल के लिए कस्टम प्राथमिक कुंजी के रूप में एक स्ट्रिंग का उपयोग करें 0 हो जाता है


84

मैं अपनी तालिका की प्राथमिक कुंजी के रूप में ईमेल का उपयोग करने का प्रयास कर रहा हूं, इसलिए मेरा स्पष्ट कोड है-

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class UserVerification extends Model
{
    protected $table = 'user_verification';
    protected $fillable =   [
                                'email',
                                'verification_token'
                            ];
    //$timestamps = false;
    protected $primaryKey = 'verification_token';
}

और मेरा DB इस तरह है-

यहाँ छवि विवरण दर्ज करें

लेकिन अगर मैं ऐसा करता हूं-

UserVerification::where('verification_token', $token)->first();

मुझे यह मिल रहा है-

{
  "email": "sdfsdf@sdfsdf.sdf",
  "verification_token": 0,
  "created_at": "2016-01-03 22:27:44",
  "updated_at": "2016-01-03 22:27:44"
}

तो, सत्यापन टोकन / प्राथमिक कुंजी 0 हो जाती है।

क्या कोई मदद कर सकता है?

जवाबों:


184

इसे 29 दिसंबर, 2015 को अपग्रेड डॉक्यूमेंट में जोड़ा गया था , इसलिए यदि आप इससे पहले अपग्रेड हुए थे तो आप शायद इससे चूक गए थे।

मॉडल से कोई विशेषता लाते समय यह जांचता है कि क्या स्तंभ को पूर्णांक, स्ट्रिंग, आदि के रूप में डाला जाना चाहिए।

डिफ़ॉल्ट रूप से, ऑटो-इंक्रीमेंटिंग टेबल के लिए, आईडी को इस विधि में पूर्णांक माना जाता है:

https://github.com/laravel/framework/blob/5.2/src/Illuminate/Database/Eloquent/Model.php#L2790

तो समाधान है:

class UserVerification extends Model
{
    protected $primaryKey = 'your_key_name'; // or null

    public $incrementing = false;

    // In Laravel 6.0+ make sure to also set $keyType
    protected $keyType = 'string';
}

3
क्या ऐसा कोई कारण है कि $incrementingक्षेत्र संरक्षित होने के बजाय सार्वजनिक है?
मुबाशर अब्बास

5
@MubasharAbbas वैसे आपके मॉडल को एलोकेंट से मेल खाना है। अब, एलोकेंट $incrementingसार्वजनिक और $primaryKeyसंरक्षित क्यों करता है? यह बहुत मनमाना है। मैं अनुमान लगा रहा हूँ कि $incrementingएलोक्वेंट के पुराने संस्करणों में गेट्टर या सेटर विधियाँ नहीं हैं (यह अब करता है) और वे सिर्फ उन्हें जोड़ने के बाद ब्रेकिंग परिवर्तन नहीं करना चाहते थे
andrewtweber

1
यदि आपके पास कोई प्राथमिक कुंजी नहीं है (या समग्र कुंजियाँ, जो एलोकेंट द्वारा समर्थित नहीं हैं), और आप ऐसी तालिका को पुनरावृत्त करने का प्रयास कर रहे हैं chunk, तो आप निम्न त्रुटि का सामना कर सकते हैं SQLSTATE[42S22]: Column not found: 1054 Unknown column 'example.' in 'order clause':। इस मामले में आपको orderByकथन को स्पष्ट रूप से परिभाषित करने की आवश्यकता है , जिसे एलोकेंट प्राथमिक कुंजी के साथ आपकी क्वेरी में संलग्न करने का प्रयास कर रहा है।
एंटोंगोरोडज़की 14

दुःख की बात है कि ये सब कुछ लारावेल करता है जो मुझे अपने पूरे दिल से प्यार करने से रोकता है। स्तंभ प्रकार का पता नहीं लगाएगा (जैसे कि यह अन्य स्तंभों के साथ ऐसा करता है) अधिक समझ में आता है?
मिस अमेलिया सारा


7

आपके द्वारा सेट किए जाने वाले मॉडल पर दो गुण हैं। पहले $primaryKeyमॉडल क्या स्तंभ पर प्राथमिक कुंजी उम्मीद करने के बताने के लिए। दूसरा $incrementingतो यह जानता है कि प्राथमिक कुंजी एक रैखिक ऑटो वेतन वृद्धि मूल्य नहीं है।

class MyModel extends Model
{
    protected $primaryKey = 'my_column';

    public $incrementing = false;
}

अधिक जानकारी के लिए एलोकेंट पर प्रलेखनPrimary Keys में अनुभाग देखें ।


1
इसे public $incrementingपैरेंट क्लास से मैच करना होगा।
andrewtweber

2

मैं अपने Laravel API का परीक्षण करने के लिए Postman का उपयोग कर रहा था।

मुझे एक त्रुटि मिली जो बताई गई है

"SQLSTATE [42S22]: कॉलम नहीं मिला: 1054 अज्ञात कॉलम" क्योंकि लारवेल स्वचालित रूप से दो कॉलम "create_at" और "update_at" बनाने की कोशिश कर रहा था।

मुझे public $timestamps = false;अपने मॉडल में प्रवेश करना था । फिर, मैंने पोस्टमैन के साथ फिर से परीक्षण किया और देखा कि "id" = 0मेरे डेटाबेस में एक चर बनाया जा रहा है।

आखिरकार मुझे public $incrementing false;अपने एपीआई को ठीक करने के लिए जोड़ना पड़ा ।


2

आईडी का उपयोग करते रहें


<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class UserVerification extends Model
{
    protected $table = 'user_verification';
    protected $fillable =   [
                            'id',
                            'email',
                            'verification_token'
                            ];
    //$timestamps = false;
    protected $primaryKey = 'verification_token';
}

और ईमेल प्राप्त करें:

$usr = User::find($id);
$token = $usr->verification_token;
$email = UserVerification::find($token);
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.