mam do czynienia z następującą sytuacją: Mam dwóch modeli, co stanowi Employee
z id
i name
pól i Telephone
z id
, employee_id
i flag
dziedzinach. Między tymi dwoma modelami istnieje również między jednym modelem , tzn. Pracownik może mieć wiele telefonów, a telefon może należeć do jednego pracownika.Zapytania za pomocą wielu połączeń z bazą danych MySQL w laravel 5,2
class Employee extends Model
{
public function telephones()
{
return $this->hasMany(Telephone::class);
}
}
class Telephone extends Model
{
public function employee()
{
return $this->belongsTo(Employee::class);
}
}
Model Employee
odwołuje się do tabeli employees
że istnieje w schemacie bazy danych o nazwie mydb1
, podczas gdy model Telephone
dotyczy telephones
tabeli, która istnieje w innym schemacie bazy danych o nazwie mydb2
.
Co chcę jest pobrać tylko pracownikom przynajmniej jeden telefon określonej flagi chętny załadowanego, stosując wymowne i (jeśli to możliwe), nie Konstruktora kwerend
Co próbowałem tak daleko bez sukcesu jest:
1) użyć metody whereHas w kontrolerze
$employees = Employee::whereHas('telephones', function ($query) {
$query->where('flag', 1); //Fetch only the employees with telephones of flag=1
})->with([
'telephones' => function ($query) { //Eager load only the telephones of flag=1
$query->where('flag', 1);
}
])->get();
Co staram się zrobić tutaj jest pierwszy pobrać tylko pracowników, które mają telefony z flaga = 1, a drugi do upragnieniem obciążeniu tylko te telefony, ale pojawia się następujący wyjątek zapytania z powodu różnych stosowane połączenia db: tabela
bazowa lub widok nie znaleziono: mydb1.telephones tabela nie istnieje (i to telefony istnieje mydb2)
2) ładunek Eager z więzów w kontrolerze
$employees = Employee::with([
'telephones' => function ($query) {
$query->where('flag', 1);
},
])->get();
Metoda ta chętnie ładuje telefony z flaga = 1, ale zwraca wszystkie instancje pracownika, który nie jest to, czego naprawdę chcą. Chciałbym mieć tylko modele pracowniczych, które są w telefon z flag
= 1 Zbiór , z wyłączeniem modeli z telephones = []
Tylko sugestia, ale może mógłbyś zrobić [widok] (http://dev.mysql.com/doc/refman/5.7/en/view-syntax.html) w jednej z twoich baz danych, która scala '' pracowników i "telefony", a następnie wyciągnąć z widoku w swoim kodzie. Także [zobacz dyskusję na temat łączenia baz danych w MySQL] (http://stackoverflow.com/questions/1565993/oracle-database-link-mysql-equivalent). – Richard
Czy ustawiłeś chronione $ connection = 'mydb2'; do modelu telefonu? – Froxz
@Froxz tak, ale niestety whereHas() nie bierze tego pod uwagę – ira