2016-01-28 7 views
7

Ich versuche, die hasManyThrough-Beziehung in Laravel 5.1 zu verwenden, aber die SQL-Abfrage verwendet nicht das entsprechende Präfix in jeder Verbindung für jedes verwendete Modell definiert. Ich habe 3 Modelle, von denen 2 die gleiche Verbindung verwenden und eine von ihnen eine andere verwendet. Der einzige Unterschied zwischen den Verbindungen ist das Präfix der Datenbank.Verschiedene DB-Verbindung für Modelle mit hasManyThrough-Beziehung in Laravel 5.1

  • Modell A hat Verbindung A das Präfix A_ verwendet
  • Modell B Verbindung B, das Präfix B_
  • Modell C verwendet, hat Verbindung B, die Vorsilbe B_

Die Beziehung nutzt:

Innerhalb des Modells B:

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

Die endgültige Abfragelogik ist korrekt, verwendet jedoch anstelle des Präfix B_ für die verbundenen Tabellen das Präfix A_ für alle Tabellen in der Abfrage.

Ist das ein Fehler/Einschränkung von Laravel? Gibt es eine Lösung für dieses Problem oder muss ich manuell beitreten, um das zu erreichen, was ich möchte?

+0

Laravel-Modelle werden nicht mit verschiedenen Verbindungen für Beziehungen arbeiten, weil eloquent verwendet SQL verbindet hinter den Kulissen und das wird nicht mit mehr als einer DB-Verbindung möglich sein – AfikDeri

Antwort

1

Andere Beziehungstypen arbeiten mit mehreren Datenbankverbindungen:

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

Aber hasManyThrough nicht die $table Parameter in seiner Unterschrift hat, so dass die gleiche Lösung ist nicht anwendbar.

jedoch

Sie können eine unvollkommene Abhilfe wie diese machen:

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

Es bietet nicht die exakt gleiche Funktionalität (Da es sich um eine andere Return-Typ ist), sondern erfüllt die Zweck für einfachere Dinge.

Wenn Sie möchten, können Sie auch tun, so etwas wie dies etwas mehr von der Syntax replizieren:

protected $appends = [ 
    'foos', 
]; 

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

diese Weise können Sie noch in Ihrem Code verwenden können, wie würden Sie die meiste Zeit mit einer regelmäßigen Beziehung (Bedeutung Sie können $this->foos anstelle von $this->foos()->get() verwenden)