首页 文章

Laravel雄辩而复杂的关系

提问于
浏览
8

Laravel看起来像一个非常好的PHP框架,捆绑了一个很好的ORM(Eloquent) . 然而,laravel文档是缺乏的东西 . 文档中只包含基本内容 .

无论如何,当涉及到超过2个模型的Eloquent和模型关系时,我遇到了问题 .

For example, I have the following scenario.

我有四个数据库表,即: userslocationsusers_locationspackages . 模型/表格之间的关系如下:

用户可以属于许多位置,反之亦然 . 一个位置可以有很多包 .

我相应的模型关系如下:

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

What do I want to do? :我想让所有软件包都属于用户 . 用户属于位置,而包也属于位置 . 因此,从属于用户的所有位置,我想要检索属于用户的那些位置的包 . 我还希望对结果集进行分页 .

我尝试过以下方法:

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

problem ,如上所述,我无法在包上实现分页 . 有没有人知道如何正确地使用Eloquent以有效的方式做到这一点?或者它是不可能的?

1 回答

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

相关问题