簡體   English   中英

如何在某些條件下組合表中的行 Laravel

[英]How to combine rows in a table with some condition Laravel

我有多個表,我使用“join”(下面給出的代碼)將它們組合在一起,現在我有一個組合表,它為特定用戶和特定測驗(如下所示)提供了正確數量的答案:

在此處輸入圖像描述

我想添加或想顯示相同用戶的組合結果和這樣的測驗(如下所示):

在此處輸入圖像描述

這是我的刀片代碼:

<thead>
                                <tr>
                                <th>Quiz Name</th>
                                <th>Quiz ID</th>
                                <th>UserName</th>
                                <th>User ID</th>
                                <th>Correct</th>
                                </tr>
                            </thead>

                            <tbody>
                                @foreach($data_correct as $row)
                                
                                <tr>
                                <td>{{$row->qname}}</td>
                                <td>{{$row->quiz_id}}</td>
                                <td>{{$row->name}}</td>
                                <td>{{$row->user_id}}</td>
                                <td>{{$row->is_correct}}</td>
                                </tr>
                                @endforeach
                                
                            </tbody>

這是我的 controller function:

public function leaderboard(){

   
    $quizzes = (new Quiz)->allQuiz();

    $users = (new User)->allUsers();

    $data_correct = DB::table('results')
    ->join('answers', 'answers.id', 'results.answer_id')
    ->join('quizzes', 'quizzes.id', 'results.quiz_id')
    ->join('users', 'users.id', 'results.user_id')
    ->select('quizzes.qname', 'results.quiz_id','users.name' ,'results.user_id', 'answers.is_correct')->where('is_correct', 1)
    ->get();

    $data_wrong = DB::table('results')
    ->join('answers', 'answers.id', 'results.answer_id')
    ->select('results.quiz_id', 'results.user_id', 'answers.is_correct')->where('is_correct', 0)
    ->get();

    return view('leaderboard', compact('quizzes', 'data_correct', 'data_wrong'));

 }

測驗表: 在此處輸入圖像描述

答案表: 在此處輸入圖像描述

結果表: 在此處輸入圖像描述

Sql 查詢以獲得所需的結果將是

select
    results.quiz_id, results.user_id, users.name, quizes.qname as QuizName, quizes.id as QuizId, count(answers.is_correct) as Score
from results
join `users`
on results.user_id = users.id
join quizes
on results.quiz_id = quizes.id
join answers
on results.answer_id = answers.id
group by results.quiz_id,users.id

所以我猜想使用 Laravel 查詢構建器,查詢可以寫成


$summary = DB::table('results')
    ->join('users', 'results.user_id', 'users.id')
    ->join('quizes', 'results.quiz_id', 'quizes.id')
    ->join('answers', 'results.answer_id', 'answers.id')
    ->selectRaw("results.quiz_id as QuizId, results.user_id as UserId, users.name as UserName, quizes.qname as QuizName, quizes.id as QuizId, count(answers.is_correct) as Score")
    ->groupBy('results.quiz_id', 'results.user_id')
    ->get();

這應該為您提供所需的數據摘要。

PS:檢查並修復 groupBy 的 Laravel 查詢生成器語法,我不確定。

試試這個兄弟

public function leaderboard(){
    $quizzes = (new Quiz)->allQuiz();
    $users = (new User)->allUsers();
    $data_correct = DB::table('users')
    ->join('answers', 'answers.id', 'results.answer_id')
    ->join('quizzes', 'quizzes.id', 'results.quiz_id')
    ->join('results', 'results.user_id', 'user.id')
    ->select(
       'quizzes.qname', 
       DB::raw('SUM(is_correct) as is_correct FROM answers where answers.id=results.answer_id'),
       'users.name' ,
       'results.user_id'
    )->
    where('answers.is_correct', 1)
    ->get();
    $data_wrong = DB::table('results')
    ->join('answers', 'answers.id', 'results.answer_id')
    ->select('results.quiz_id', 'results.user_id', 'answers.is_correct')->where('is_correct', 0)
    ->get();

    return view('leaderboard', compact('quizzes', 'data_correct', 'data_wrong'));

 }

如果我沒看錯,您可以在 select 查詢中使用變量“quizzes.qname”。 但我只在測驗表中看到名字。 嘗試這個:

public function leaderboard(){


$quizzes = (new Quiz)->allQuiz();

$users = (new User)->allUsers();

$data_correct = DB::table('results')
->join('answers', function ($join) {
    $join->on('answers.id', '=', 'results.answer_id')
        ->where('answers.is_correct', 1)
    })
->join('quizzes', 'quizzes.id', '=', 'results.quiz_id')
->join('users', 'users.id', '=', 'results.user_id')
->select('quizzes.qname', 'results.quiz_id','users.name' ,'results.user_id', DB::raw('count(answers.is_correct) as score'))
->groupBy('results.quiz_id', 'results.user_id')
->get();

$data_wrong = DB::table('results')
->join('answers', function ($join) {
    $join->on('answers.id', '=', 'results.answer_id')
        ->where('answers.is_correct', 0)
    })
->select('results.quiz_id', 'results.user_id', DB::raw('count(answers.is_correct) as score'))
->groupBy('results.quiz_id', 'results.user_id')
->get();

return view('leaderboard', compact('quizzes', 'data_correct', 'data_wrong'));

}

在您發表評論后,我再次對其進行了調整。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM