2016-01-28 45 views
7

में मैनी थ्रू रिश्ते का उपयोग कर मॉडल के लिए अलग-अलग डीबी कनेक्शन मैं लार्वेल 5.1 में मैनी थ्रू रिश्तों का उपयोग करने की कोशिश कर रहा हूं लेकिन एसक्यूएल क्वेरी प्रत्येक मॉडल के लिए प्रत्येक कनेक्शन में परिभाषित उपयुक्त उपसर्ग का उपयोग नहीं कर रही है। मेरे पास 3 मॉडल 2 हैं जिनमें से एक ही कनेक्शन का उपयोग करते हैं और उनमें से एक अलग-अलग उपयोग करता है। कनेक्शन के बीच एकमात्र अंतर यह है कि डेटाबेस उपसर्ग है।लार्वेल 5.1

  • मॉडल ए संबंध नहीं है एक जो उपसर्ग A_ का उपयोग करता
  • मॉडल बी कनेक्शन बी जो उपसर्ग B_ का उपयोग करता है
  • मॉडल सी कनेक्शन बी जो उपसर्ग B_

संबंध का उपयोग करता है:

मॉडल बी के अंदर:

public function relationshipWithA() 
{ 
    return $this->hasManyThrough(A::class, C::class, 'Cid', 'Aid'); 
} 

अंतिम क्वेरी तर्क सही है लेकिन क्वेरी में सभी तालिकाओं के लिए ए_ उपसर्ग का उपयोग करके जुड़ गए तालिकाओं के लिए B_ उपसर्ग का उपयोग करने के बजाय।

क्या यह लार्वा का एक बग/सीमा है? क्या इसका कोई समाधान है या मुझे जो चाहिए वो हासिल करने के लिए मैन्युअल रूप से शामिल होना होगा?

+0

लार्वेल मॉडल संबंधों के लिए अलग-अलग कनेक्शन के साथ काम नहीं करेंगे क्योंकि स्पष्ट रूप से एसक्यूएल दृश्यों के पीछे जुड़ता है और यह एक से अधिक डीबी कनेक्शन के साथ संभव नहीं होगा – AfikDeri

उत्तर

1

अन्य संबंध प्रकार एकाधिक डेटाबेस कनेक्शन के साथ काम:

public function foos() 
{ 
    return $this->belongsToMany(Foo::class, 'other_db.foos'); 
} 

लेकिन hasManyThrough अपने हस्ताक्षर में $table पैरामीटर नहीं होता है, इसलिए एक ही समाधान लागू नहीं है।

हालांकि ,

आप इस तरह एक अपूर्ण वैकल्पिक हल कर सकते हैं:

public function bars() 
{ 
    return $this->belongsToMany(Bar::class, 'other_db.bars'); 
} 

public function foos() 
{ 
    $barIds = $this->bars->pluck('id'); 
    return Foo::whereIn('bar_id', $barIds); 
} 

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

protected $appends = [ 
    'foos', 
]; 

/** 
* @return Foo[] 
*/ 
public function getFoosAttribute() 
{ 
    return $this->foos()->get(); 
} 

इस तरह आप अभी भी तरह आप एक नियमित के साथ समय के सबसे अधिक होगा इसे अपने कोड में उपयोग कर सकते हैं:

यदि आप चाहते हैं, आप भी वाक्य रचना के कुछ और कुछ इस तरह करने से दोहराने कर सकते हैं रिश्ते (मतलब आप $this->foos()->get() के बजाय $this->foos का उपयोग कर सकते हैं)

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