用关系列总和排序

时间:2016-09-10 13:54:30

标签: php laravel laravel-5.2

问题有很多答案。答案有很多评论和投票。评论有很多票。

我需要通过投票来命令答案。答案表没有投票栏。但是,答案与投票有很多关系。投票表有一个投票栏,投票栏的总和给出了总票数。目前,默认情况下,答案按ID排序。

$questions = Question::with('users', 'answers', 'answers.comments.votes', 'answers.votes')->get();              
foreach($questions as $question)
{
   print_r($question->question);       
   foreach($question->answers as $answer)
   {
        print_r($answer->answer);      
        $votes = $answer->votes->sum('vote');
        print_r($votes);                
    } 
}

答案有很多票和很多评论。评论有很多票。所以,多态关系。

votes table.
id user_id  vote  votable_id  votable_type
1     4       4     1           App\Answer
2     5       3     1           App\Answer
......

这里答案ID 1的投票是7.如何以最大票数订购答案?

2 个答案:

答案 0 :(得分:1)

提供关系,以便获得解决方案。根据我的理解,如果您想通过列在嵌套关系中进行排序,可以尝试以下代码:

$questions = Question::with(['users','answers' => function ($query)
                {   
                        $query->orderBy('column','Desc')
                              ->with('comments.votes')   
                              ->with('votes');   
                }])->get();

答案 1 :(得分:1)

要检索答案模型实例,按照投票总数排序,请尝试此(未经测试的)代码段

Answer::join('votes', function($join)
    {
        $join->on('votes.votable_id', '=', 'answer.id');
        $join->where('votes.votable_type', '=', 'answer');
    })
    ->groupBy('answer.id')
    ->orderByRaw('sum(votes.vote)')
    ->limit(10)
    ->get();

将来,每次为很多答案计算选票可能都是一种技巧。我想到在答案表中保留一张选票。