如何在Laravel 5中只查询一对多关系中的一个外行

时间:2017-06-30 08:49:03

标签: mysql laravel laravel-5

我有4个模型:postsuserscategoriesuserCategories

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而不是循环。

我该怎么做?

1 个答案:

答案 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

希望这有帮助!