php – Laravel Eloquent和复杂的关系
发布时间:2020-12-14 19:47:25 所属栏目:大数据 来源:网络整理
导读:Laravel看起来像一个非常好的 PHP框架,捆绑了一个很好的ORM(Eloquent).然而,laravel文档是缺乏的东西.文档中只包含基本内容. 无论如何,当涉及到超过2个模型的Eloquent和模型关系时,我遇到了问题. 例如,我有以下场景. 我有四个数据库表,即:users,locations,u
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','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以有效的方式做到这一点?或者它是不可能的? //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; (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |