2016-01-28 25 views
7

Sto tentando di utilizzare la relazione hasManyThrough in laravel 5.1 ma la query sql non utilizza il prefisso appropriato definito in ciascuna connessione per ogni modello utilizzato. Ho 3 modelli 2 dei quali usano la stessa connessione e uno di loro ne usa uno diverso. L'unica differenza tra le connessioni è il prefisso che il database è lo stesso.Connessione DB diversa per i modelli che utilizzano la relazione hasManyThrough in laravel 5.1

  • Model A ha connessione A che utilizza prefisso A_
  • modello B ha connessione B che utilizza prefisso B_
  • Modello C trovi connessione B che utilizza prefisso B_

La relazione:

interno modello B:

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

La logica di query finale è corretta ma invece di utilizzare il prefisso B_ per le tabelle unite viene utilizzato il prefisso A_ per tutte le tabelle nella query.

Si tratta di un bug/limitazione di laravel? C'è una soluzione a questo o dovrò fare il join manuale per ottenere ciò che voglio?

+0

I modelli laravel non funzionano con connessioni diverse per le relazioni perché eloquente utilizza join SQL dietro le quinte e ciò non sarà possibile con più di una connessione DB – AfikDeri

risposta

1

Altri tipi di relazione lavorare con più connessioni al database:

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

Ma hasManyThrough non hai il parametro $table nella sua firma, in modo che la stessa soluzione non è applicabile.

Tuttavia,

È possibile effettuare una soluzione imperfetta come questo:

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

non offre la stessa identica funzionalità (Poiché si tratta di un altro ritorno-tipo), ma soddisfa la scopo per cose più semplici.

Se si desidera, è anche possibile riprodurre un po 'della sintassi facendo qualcosa di simile:

protected $appends = [ 
    'foos', 
]; 

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

In questo modo si può ancora usare nel codice come si farebbe la maggior parte del tempo con un regolare relazione (Significato è possibile utilizzare $this->foos anziché $this->foos()->get())