2016-01-28 24 views
7

Próbuję użyć relacji hasManyThrough w laravel 5.1, ale kwerenda sql nie używa odpowiedniego prefiksu zdefiniowanego w każdym połączeniu dla każdego używanego modelu. Mam 3 modele 2 z których korzysta z tego samego połączenia i jeden z nich używa innego. Jedyną różnicą między połączeniami jest przedrostek, w którym baza danych jest taka sama.Różne połączenia db dla modeli używających relacji maManyThrough w języku laravel 5.1

  • Wzór A ma połączenie A, który wykorzystuje prefiksu a_
  • Wzór B ma połączenie B, który wykorzystuje prefiksu B_
  • modelu C ma połączenie B, który wykorzystuje prefiks B_

zależności:

Model wewnętrzny B:

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

Końcowa logika zapytań jest poprawna, ale zamiast prefiksu B_ dla połączonych tabel używa prefiksu A_ dla wszystkich tabel w zapytaniu.

Czy to błąd/ograniczenie laravel? Czy istnieje rozwiązanie tego problemu, czy też będę musiał ręcznie dołączyć, aby osiągnąć to, czego chcę?

+0

Modele laravel nie będą działać z różnymi połączeniami dla relacji, ponieważ elokwentny używa połączeń SQL za kulisami i nie będzie to możliwe w przypadku więcej niż jednego połączenia DB – AfikDeri

Odpowiedz

1

Inne rodzaje stosunku pracy z wielu połączeń bazy danych:

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

Ale hasManyThrough nie posiada parametr w jego podpisania $table, tak samo rozwiązanie nie jest stosowane.

Jednak

Można dokonać niedoskonały obejście takiego:

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

nie oferuje dokładnie taką samą funkcjonalność (Ponieważ jest to inny zwrot typu), ale spełnia cel dla prostszych rzeczy.

Jeśli chcesz, możesz także replikować kilka składni robiąc coś takiego:

protected $appends = [ 
    'foos', 
]; 

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

ten sposób można nadal używać go w kodzie jak byś większość czasu z regularnym relacja (co oznacza, że ​​można używać modeli $this->foos zamiast $this->foos()->get())