2015-09-10 5 views
5

User में एक (या शून्य) Company है, और Company एक और केवल एक User से संबंधित है। मैं किसी उपयोगकर्ता के लिए एक कंपनी को सहेजने की कोशिश करता हूं लेकिन जब भी मैं सहेजने की विधि को फिर से ट्रिगर करता हूं तो डेटाबेस में यह एक नई प्रविष्टि जोड़ता है। यह एक से एक संबंध है, इसलिए मैं विधि User पर विधि।लार्वेल में एक से एक संबंध को सहेजना

तो Company एक विधि user() है:

public function company() { 
    return $this->hasOne(Company::class, 'user_id'); 
} 

मैं बचाने के लिए इस तरह एक उपयोगकर्ता के कंपनी (ताकि या उसे अपडेट) कोशिश कर रहा हूँ (:

public function user() { 
    return $this->belongsTo(User::class, 'user_id'); 
} 

और User एक विधि company() है एक नियंत्रक में):

$company = new Company(); 
$company->name = 'Test'; 
User::findOrFail(1)->company()->save($company); 

पहली बार जब मैं इस कोड को चलाता हूं तो यह डेटाबेस (ठीक) में प्रविष्टि बनाता है, लेकिन दूसरी बार यह उसी उपयोगकर्ता के लिए एक नई प्रविष्टि जोड़ता है (ठीक नहीं है)। मैंने सोचा कि यह केवल डेटाबेस प्रविष्टि को अद्यतन करेगा।

क्या यह लारवेल या में एक गड़बड़ है (या मुझे एक से एक संबंध में नहीं समझा जाता है) क्या मैं कुछ गलत कर रहा हूं? (मुझे लगता है कि और आशा है कि यह दूसरा उद्देश्य है)

+0

चेक इस जवाब है, यह आपकी मदद कर सकता है: http://stackoverflow.com/a/20764237/5122070 –

+0

धन्यवाद, लेकिन मुझे यकीन है कि यह वास्तव में इस विशेष समस्या के लिए मदद करता है नहीं कर रहा हूँ। मेरी समस्या अधिक विशिष्ट है। यह –

उत्तर

8

बनाना और अद्यतन करने के दूसरे तरीके से इलाज करने के लिए की जरूरत है आपकी कंपनी है। तो पहले कंपनी विशेषता के अस्तित्व की जांच करें।

$user = User::with('company')->findOrFail(1); 
if ($user->company === null) 
{ 
    $company = new Company(['name' => 'Test']); 
    $user->company()->save($company); 
} 
else 
{ 
    $user->company->update(['name' => 'Test']); 
} 

ध्यान दें कि hasOne() की गारंटी नहीं देता है कि आप एक-से-एक संबंध है, यह सिर्फ सुवक्ता कह क्वेरी बनाने का तरीका होगा। यह आपके काम करता है, यहां तक ​​कि आपके पास समान User का संदर्भ है, ऐसे मामले में जब आप $user->company पर कॉल करते हैं तो आपको डेटाबेस से सेट किए गए परिणाम डेटा में पहले Company मिलेंगे।

+0

ठीक है धन्यवाद। "ध्यान दें कि हैऑन() गारंटी नहीं देता है कि आपके पास एक-से-एक रिश्ते होगा, यह सिर्फ पूछताछ करें कि क्वेरी कैसे बनाएं" -> बहुत उपयोगी, यह अभी स्पष्ट है। –

0

तुम गलत यहाँ

$company = new Company(); 
$company->name = 'Test'; 
User::findOrFail(1)->company()->save($company); 

आप तो अपने कोड हो गया है जो पंक्ति

अद्यतन करने के लिए कह रही है नहीं कर रहे हैं कर रहे हैं इस

$companyId अद्यतन करने के लिए

$company = new Company(); 
$company->name = 'Test'; 
User::findOrFail(1)->company()->find($companyId)->save($company); 
+0

संबंध में सीधे बचत (बनाने या अपडेट करने) के बारे में है, लेकिन मुझे इस बिंदु पर कंपनी आईडी नहीं पता है, मैं सिर्फ एक उपयोगकर्ता के लिए कंपनी मूल्यों को अपडेट करना चाहता हूं (संभावित पिछले एक की देखभाल किए बिना)। मैबी यह असंभव है, लेकिन यह अजीब लगता है कि 'सेव() 'संबंध प्रकार की परवाह नहीं करता है (यहां, यह एक से एक पर harcoded है) –

+0

@ रैप -2 एच एच आपके पास एक फॉर्म है जहां आप कंपनी की जानकारी पास कर रहे हैं।यदि उपयोगकर्ता की कंपनी की जानकारी है तो एक आईडी होगी यदि नहीं तो आप खाली होने के लिए आईडी छोड़ देते हैं और जब आप फॉर्म पोस्ट करते हैं तो आपको आईडी मिलती है। अब यदि आईडी मान है तो आप पाते हैं और अपडेट करते हैं या आप डालेंगे। –

+0

ठीक है धन्यवाद। मुझे पता है कि यह एक रूप में छिपे हुए क्षेत्र का उपयोग करने का एक समाधान है, लेकिन मेरा सवाल यह है कि हम ऐसी चीजें कर सकते हैं? लैरवेल जानता है कि यह एक उपयोगकर्ता के लिए केवल एक कंपनी हो सकती है, तो जब मैं इसे सहेजता हूं तो यह एक नई कंपनी क्यों जोड़ता है। यह अजीब लगता है (जैसे कि यह घोषित नहीं किया जाता है), इसलिए मुझे लगता है कि मैं गलत तरीके से कर रहा हूं। –

4
$user = User::findOrFail(1); 
$company = $user->company ?: new Company; 
$company->name = 'Test'; 
$user->company()->save($company); 
+0

इस तरह से भी! त्वरित और साफ! +1 :) –

संबंधित मुद्दे