मैंने अपने जैसे अन्य प्रश्नों का संदर्भ दिया है, लेकिन मैं यह नहीं समझ सकता कि मुझे अपने उदाहरण में त्रुटि क्यों मिल रही है।

मेरे पास 3 टेबल हैं। nn_album, nn_song और पिवट टेबल nn_song_album_song

मेरी तालिका आईडी नाम nn_album.album_id , nn_song.song_id हैं, पिवट तालिका में प्राथमिक कुंजी के रूप में आईडी है और समान कॉलम नाम "song_id" और "album_id" है

मैं एक एल्बम जोड़ सकता हूं लेकिन जब मैं किसी एल्बम में एक नया गाना जोड़ना चाहता हूं, तो मुझे यह त्रुटि सेव फंक्शन पर मिल रही है ...

SQLSTATE [23000]: अखंडता बाधा उल्लंघन: 1052 कॉलम 'album_id' फ़ील्ड सूची में अस्पष्ट है (SQL: album_id से nn_album का चयन करें nn_song_album_song nn_album पर।album_id = nn_song_album_song.album_id जहां nn_song_album_song.song_id = 21)

माई सॉन्ग मॉडल

public function albums()
{
    return $this->belongsToMany('App\Albums', 'nn_song_album_song', 'song_id', 'album_id');
}

मेरा एल्बम मॉडल

public function songs()
{
    return $this->belongsToMany('App\SongDetail', 'nn_song_album_song', 'song_id', 'album_id');
}

माई कंट्रोलर सेव फंक्शन

$albums = request('albums');

if ($song_id>0)
{
    $entry = SongDetail::where('song_id', $song_id)->firstOrfail();
    $entry->update($data);
    $entry->albums()->sync($albums);
}
else
{
    $entry = SongDetail::create($data);
    $entry->albums()->attach($albums);
}

एक एल्बम इनपुट चुनने के लिए व्यवस्थापक पक्ष पर मेरा दृश्य (मैं जोड़ने के लिए एकाधिक एल्बम चुन सकता हूं)

<div class="form-group form-float mainalbum" style="margin-bottom: 45px;border-bottom: solid 1px;">
    <div class="form-line">


        <select class="form-control show-tick" name="albums[]" id="albums" data-live-search="true" >

            @foreach($albums as $album)
                @if($album->album_id != 1)<option value="{{ $album->album_id }}" {{ collect(old('albums', $album))->contains($album->album_id) ? 'selected': '' }}>
                    {{ $album->album_name }}</option>@endif
            @endforeach


        </select>
        <select class="albums2" name="albums2[]" id="albums2" multiple>
            @foreach($albums as $album)
                @if($album->album_id != 1)<option value="{{ $album->album_id }}" {{ collect(old('albums', $album))->contains($album->album_id) ? 'selected': '' }}>
                    {{ $album->album_name }}</option>@endif
            @endforeach
        </select>
    </div>

</div>

क्या आपको पता है कि यहाँ क्या हो रहा है? मेरी गल्ती क्या है? यदि आप मेरे साथ अपने विचार साझा करते हैं, तो मैं आपकी सराहना करता हूं।

धन्यवाद।

-1
syali 11 मार्च 2020, 22:49
1
वैसे एसक्यूएल त्रुटि संदेश आपको इस ओर इशारा कर रहा है कि एल्बम_आईडी दोनों तालिकाओं में मौजूद है लेकिन आप एल्बम_आईडी का चयन कर रहे हैं, यह निर्दिष्ट किए बिना कि आप क्या चाहते हैं इसलिए यह अस्पष्ट है
 – 
Patrick Kelly
11 मार्च 2020, 22:57
आपके उत्तर के लिए पैट्रिक धन्यवाद, लेकिन मैं लारवेल पर अपने मॉडल में इस एसक्यूएल को कैसे लिख सकता हूं? क्या आपके पास कोई विचार है?
 – 
syali
12 मार्च 2020, 20:15
क्या दिए गए उत्तरों में से कोई मददगार था? आपको ▲ सभी उत्तरों के साथ अपवोट करना चाहिए जो कि मददगार थे यदि आपमें ऐसा करने की प्रतिष्ठा है। फिर आपको ✓ के साथ स्वीकृत के रूप में चिह्नित करना चाहिए एक उत्तर जो आपके प्रश्न का सबसे अच्छा उत्तर देता है। यह प्रश्न को "बंद" के रूप में चिह्नित करेगा और आपको साइट पर कुछ प्रतिष्ठा देगा। यदि कोई भी उत्तर संतोषजनक नहीं था, तो टिप्पणियों के साथ प्रतिक्रिया दें, या समस्या को स्पष्ट करने के लिए अपने प्रश्न को संपादित करें।
 – 
miken32
20 मार्च 2020, 20:17

2 जवाब

वैसे एसक्यूएल त्रुटि संदेश आपको इस ओर इशारा कर रहा है कि एल्बम_आईडी दोनों तालिकाओं में मौजूद है लेकिन आप एल्बम_आईडी का चयन कर रहे हैं, यह निर्दिष्ट किए बिना कि आप क्या चाहते हैं इसलिए यह अस्पष्ट है

आप इसके बजाय लाइन पर सटीक कॉलम निर्दिष्ट करके इसे हल कर सकते हैं

return $this->belongsToMany('App\Albums', 'nn_song_album_song', 'song_id', 'album_id');

इसे बदलकर

return $this->belongsToMany('App\Albums', 'nn_song_album_song', 'nn_song_album_song.song_id', 'nn_song_album_song.album_id');

मैं इस समाधान पर 100% नहीं हूं क्योंकि यह मेरे लिए सबसे परिचित वाक्यविन्यास नहीं है लेकिन आउटपुट पैरामीटर के लिए तालिका निर्दिष्ट करने से समस्या हल होनी चाहिए। आपको दोनों मॉडलों पर थो लागू करने की आवश्यकता हो सकती है। वास्तविक समाधान इसका एक रूपांतर हो सकता है लेकिन आप यहां और अन्य उत्तरों में उल्लिखित डॉट सिंटैक्स का उपयोग करके अपने प्रश्नों में फ़ील्ड के लिए विशेष रूप से तालिका नामों को निर्दिष्ट करके इसे हल करेंगे।

0
Patrick Kelly 17 मार्च 2020, 02:30

जब आप दो तालिकाओं में शामिल होते हैं तो यह कॉलम नामों में भी जुड़ जाता है। आपको यह वर्णन करना होगा कि आप किस तालिका से album_id कॉलम लेना चाहते हैं। जैसे nn_album.album_id या nn_song_album_song.album_id

आपकी sql क्वेरी इस तरह दिखनी चाहिए: select nn_album.album_id from nn_album inner join nn_song_album_song on nn_album.album_id = nn_song_album_song.album_id where nn_song_album_song.song_id = 21

-1
Ramūnas Pabrėža 11 मार्च 2020, 22:59
आपके उत्तर के लिए धन्यवाद रामुनास लेकिन मैं लारवेल पर अपने मॉडल में इस एसक्यूएल को कैसे लिख सकता हूं? क्या आपके पास कोई विचार है?
 – 
syali
12 मार्च 2020, 20:11