2016-01-28 15 views
7

laravel 5.1'deki hasManyThrough ilişkisini kullanmaya çalışıyorum ancak sql sorgusu kullanılan her model için her bağlantıda tanımlanan uygun öneki kullanmıyor. Aynı bağlantıyı kullanan ve bunlardan biri farklı olan 2 modelden 2 modelim var. Bağlantılar arasındaki tek fark, veritabanının aynı olduğu önektir.laravel'de hasManyThrough ilişkisini kullanan modeller için farklı db bağlantısı 5.1

  • model bir bağlantısı vardır önek A_ kullanan bir
  • Model B önek b_ kullanan bağlantı B sahiptir
  • Model C önek b_

ilişkiyi kullanan bağlantı B var

İç B Modeli:

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

Son sorgu mantığı doğrudur, ancak birleştirilen tabloların B_ önekini kullanarak, sorgudaki tüm tablolar için A_ önekini kullanır.

Bu bir laravel hatası/sınırlaması mı? Buna bir çözüm var mı, yoksa istediğimi elde etmek için el ile katılmalı mıyım?

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

Ama hasManyThrough onun imzası $table parametresi yoktur, bu nedenle aynı çözüm uygulanamaz:

+0

laravel modelleri, ilişkiler için farklı bağlantılarla çalışmayacaktır çünkü eloquent, sahnelerin arkasındaki SQL birleştirmelerini kullanır ve bu, birden çok DB bağlantısıyla mümkün olmaz – AfikDeri

cevap

1

Diğer ilişki türleri birden veritabanı bağlantıları ile çalışır.

Böyle kusurlu geçici çözüm yapabilir

Ancak ,: (farklı dönüş tipi olduğundan)

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); 
} 

Bu aynı işlevselliği sunmuyor, ancak yerine getirir Daha basit şeyler için amaç.

protected $appends = [ 
    'foos', 
]; 

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

düzenli ile çoğu zaman yaptığımız gibi yine kodunda kullanabilirsiniz Bu şekilde: İsterseniz

, ayrıca böyle bir şey yaparak sözdizimi biraz daha çoğaltabilir ilişki (Anlamı $this->foos()->get() yerine $this->foos kullanabileceğiniz)

İlgili konular