我有4个模型:posts
,users
,categories
,userCategories
。
posts
- users
具有一对多关系(一个帖子属于用户)。
posts
- categories
具有一对多关系(一个帖子属于某个类别)。
users
- userCategories
具有一对多关系(一个用户拥有多个userCategories)。 userCategory有一个rank
字段,用于保存特定类别的用户的性能。
我用这个查询一些帖子:
$posts = Post::with(array('user.userCategories')
)
->where('category_id', '=', $category_id)
->get();
在评估帖子后,我尝试让用户使用userCategory rank
作为帖子的类别。
$rank_of_the_post_owners = array();
foreach($posts as $post)
foreach($post->user->userCatergories as $userCategory)
if($userCategory->id == $post->category_id) {
$rank_of_the_post_owners [$post->id] = $userCategory->rank;
break;
}
}
}
为了摆脱上面的代码,我想只查询相关的userCategory(对于帖子的类别)。所以,我想访问排名信息,如user.userCategory-> rank而不是循环。
我该怎么做?
答案 0 :(得分:1)
使用with()
时,您可以使用闭包作为值来约束关系,因为您已经拥有$category_id
,所以可以执行以下操作:
$posts = Post::with(['user.userCategories' => function ($query) use ($category_id) {
$query->where('userCategories.id', $category_id);
}])
->where('category_id', '=', $category_id)
->get();
然后,如果你想,你可以添加一个访问者来获得帖子的排名:
public function getRankAttribute()
{
return $this->user->userCategories->sum('rank');
}
所以要访问你需要的等级:
$posts->first()->rank;
https://laravel.com/docs/5.4/eloquent-mutators#accessors-and-mutators
希望这有帮助!