雄辩的多对多关系,并使用数据透视表作为单独的模型

时间:2016-10-20 17:09:59

标签: php laravel

在构建laravel web应用程序时,我遇到了有趣的问题,我相信应该有一个最好的做法来解决这类问题,而无需重新发明轮子。

基本上,我有很多对多的关系:

Post有很多类别,但同时类别也有很多帖子。 属于帖子的每个类别都可以有“投票”。这些投票通常不属于该类别,而只属于category_post数据透视表条目。

我的问题是: 我应该创建一个单独的模型“CategoryPost”然后使用一对多的关系与“投票”表有一个更优雅的方式来实现它。

我也在努力使查询过程尽可能具有表现力。

2 个答案:

答案 0 :(得分:0)

基本上我在类别类中编写了这样的代码:

public function votes()
{
    // find id of pivot table column
    $categoryPost = CategoryPost::where('skill_id', $this->id)->first();
    if($categoryPost) {

       $likes = Like::where('likeable_id', $categoryPost->id)->get();

        if(count($likes)) {
            return count($likes);
        } else {
            return 0;
        }
    } else {
        return 0;
    }
}

同时我添加了ClassPost类。现在可能是最优雅的解决方案,但如果有更好的建议,那就太棒了。

答案 1 :(得分:0)

  

关于Eloquent Relationships L 5.2的Laravel文档:

     

计算关系结果

     

如果您想计算没有关系的结果数   实际加载它们你可以使用withCount方法,这将   在结果模型上放置{relation} _count列。

例如:

$posts = App\Post::withCount('comments')->get();

foreach ($posts as $post) {
    echo $post->comments_count;
}

您可以添加检索多个关系的“计数”以及向查询添加约束:

$posts = Post::withCount(['votes', 'comments' => function ($query) {
    $query->where('content', 'like', 'foo%');
}])->get();

echo $posts[0]->votes_count;
echo $posts[0]->comments_count;