Laravel wydaje się bardzo miłym frameworkiem PHP, w pakiecie z dobrym ORMem (Eloquent). Jednak doktorzy laravel są niektórzy, czego brakuje. W dokumencie znajdują się tylko podstawowe rzeczy.Laravel Eonquent i złożone relacje
W każdym razie, mam problem, jeśli chodzi o Wymowne i modelowe relacje, gdy obejmuje on więcej niż 2 modele.
Na przykład mam następujący scenariusz.
Mam cztery tabele bazy danych, a mianowicie: users
, users_locations
locations
, packages
. Relacje między modelem/tabelami są następujące:
Użytkownik może należeć do wielu lokalizacji i na odwrót. Lokalizacja może mieć wiele pakietów.
A moi odpowiednie relacje modelu są następujące:
//User Model:
public function locations(){
return $this->belongsToMany('Location', 'users_locations', 'user_id', 'location_id');
}
//Location Model:
public function users(){
return $this->belongsToMany('User', 'users_locations', 'location_id', 'user_id');
}
public function packages(){
return $this->hasMany('Package', 'location_id');
}
//Package Model:
public function location(){
return $this->belongsTo('Location', 'location_id');
}
Co chcę robić?: Chcę, aby wszystkie pakiety należały do użytkownika. Użytkownik należy do lokalizacji, a pakiety również należą do lokalizacji. Więc ze wszystkich lokalizacji, które należą do użytkownika, chcę odzyskać pakiety należące do tych lokalizacji użytkownika. Chcę również, aby zestaw wyników był paginowany.
Próbowałem następujące:
//get the logged in user ID
$userId = Auth::user()->id
//first get all the locations of the user
$locations= User::with('locations')->find($userId)->locations;
//declare an empty array to store the packages
$packages = array();
//now loop through the locations
foreach($locations as $location){
//since each location can have many packages, we also have to loop through the packages
foreach($location->packages as $package){
//store the plan in the array
$packages[] = $package;
}
}
//ok now we got the list of packages
return $packages;
problemem jest z powyższego, nie można wdrożyć paginacji na opakowaniach. Czy ktokolwiek wie, jak zrobić to poprawnie i efektywnie przy użyciu Eloquent? Czy to po prostu niemożliwe?
Zamiast tego można użyć opcji "paginate ($ page_size)". Czy istnieje JEDEN liniowy kod z wymownym miejscem, w którym mogłem uzyskać powyższe wyniki? – WebNovice
Dzięki za podpowiedź na temat paginate() - całkowicie o tym zapomniałem. Jeśli chodzi o Eloquent, nie sądzę, abyś mógł to zrobić jednym ruchem, choć byłoby to bardzo eleganckie, aby zobaczyć to w przyszłości. Na koniec możesz zawsze używać Fluent i dołączać do stołów, jak chcesz. –