2013-10-15 15 views
8

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_locationslocations, 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?

Odpowiedz

5
//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; 


/* perhaps you can alternatively use lists() function to get the ids 
something like: $loc_ids = DB::table('locations')->where('user_id',$userId)->lists('id'); */ 
$loc_ids = array(); 
foreach($locations as $location) 
{ 
    $loc_ids[] = $location->id; 
} 

$packages = Package::whereIn('location_id', $loc_ids)->skip($offset)->take($page_size)->get(); 

return $packages; 
+1

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

+0

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. –

Powiązane problemy