Laravel 看起来是一个非常不错的 PHP 框架,捆绑了一个很好的 ORM(Eloquent)。但是,laravel 文档有些欠缺。文档中仅包含基本内容。
无论如何,当涉及超过 2 个模型的 Eloquent 和模型关系时,我遇到了问题。
例如,我有以下场景。
我有四个数据库表,即: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 以正确和有效的方式做到这一点?还是只是不可能?