2013-10-15 6 views
8

Laravel кажется очень приятным фреймворком PHP, в комплекте с хорошим ORM (Красноречивым). Тем не менее, ларавельные документы - это то, чего не хватает. В документе есть только основной материал.Laravel Красноречивые и сложные отношения

В любом случае, у меня есть проблема, когда дело доходит до отношений с мужчинами и моделью, когда оно охватывает более двух моделей.

Например, у меня есть следующий сценарий.

У меня есть четыре таблицы базы данных именно: users, locations, users_locations, packages. И соотношение между моделью/таблицами выглядит следующим образом:

Пользователь может принадлежать многим местоположениям и наоборот. Местоположение может иметь множество пакетов.

И мои соответствующие модели отношения следующим образом:

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

Что я хочу сделать?: Я хочу, чтобы все пакеты принадлежали пользователю. Пользователь относится к местоположениям, а пакеты также относятся к местоположениям. Поэтому из всех мест, принадлежащих пользователю, я хочу получить пакеты, принадлежащие этим местоположениям пользователя. Я также хочу, чтобы результирующий набор был разбит на страницы.

Я попытался следующие:

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

проблема есть с вышеизложенным, я не могу реализовать пагинацию на упаковках. Кто-нибудь знает, как сделать это правильно и эффективно с помощью Eloquent? Или это просто невозможно?

ответ

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

Можете сделать 'paginate ($ page_size)' вместо этого. Есть ли ОДИН код строки с красноречием, где я мог бы получить вышеуказанные результаты? – WebNovice

+0

Спасибо за отзыв о paginate() - я полностью забыл об этом. Что касается Eloquent, я не думаю, что вы можете сделать это с одним ударом, хотя было бы очень элегантно видеть это в будущем. В конце концов, вы всегда можете использовать Fluent и присоединяться к столам по своему усмотрению. –

Смежные вопросы