【问题标题】:Displaying total answer and correct answer of each user显示每个用户的总答案和正确答案
【发布时间】:2018-06-28 12:37:22
【问题描述】:

我有一个这样的数据库结构:

表格:

users(id, email, password, ...) //默认 laravel 用户表

考生(id, user_id, ...)

exam_quizzes(ID、标题、解释)

exam_quiz_answers(id、title、exam_quiz_id、is_correct_ans)

submitted_answers(id、user_id、exam_quiz_id、exam_quiz_answer_id)

我已经设置了各自的模型和关系方法。

型号:

User, Examinee, ExamQuiz, ExamQuizAnswer, SubmittedAnswer

关系:

// User -> hasOne() -> Examinee
$user->examinee
// ExamQuiz -> hasMany() -> ExamQuizAnswer 
$examQuiz->examQuizAnswers
// SubmittedAnswer -> hasMany() -> ExamQuiz
$submittedAnswer->examQuizzes 
// SubmittedAnswer -> hasMany() -> ExamQuizAnswer
$submittedAnswer->examQuizAnswers 
// User -> hasMany() -> SubmittedAnswer
$user->submittedAnswers

在我看来,如何在像这样的表:

<tr>
    <th>Name</th>
    <th>Answered</th>
    <th>Correct</th>
</tr>
@foreach()
{{-- I have no idea what to do here --}}
  <tr>
      <td></td>
      <td></td>
      <td></td>
  </tr>
@endforeach

【问题讨论】:

  • 你试过什么?什么不工作?。
  • 我不知道该尝试什么。这就是为什么我的刀片 foreach 指令中的参数列表是空白的。一些提示怎么样,我可以试试?
  • Stackoverflow 是针对问题而不是为您提供解决方案,因此您不必自己动手。但有一个提示:Total Answered。你有$user-&gt;submittedAndwers所以要得到总数你必须数他们laravel.com/docs/5.5/collections#method-count
  • 对于全部正确答案,您需要模型中的另一个函数。我会将它添加到用户模型submittedCorrectAnswers
  • 如果您只需要计数,最好只返回计数而不是所有匹配的记录。函数类似于 getCorrectAnswerCountgetSubmittedAnswerCount ...

标签: php sql laravel eloquent blade


【解决方案1】:

在您的控制器中,您让用户将其传递给查看。

$users = User:get();

并进行 foreach 循环以获得答案和正确答案:

<tr>
    <th>Name</th>
    <th>Answered</th>
    <th>Correct</th>
</tr>
@foreach($users as $user)
  <tr>
      <td>{{$user->name}}</td>
      <td>{{count($user->submittedAnswers()->get())}}</td>
       @php 
        foreach($user->submittedAnswers()->get() as $answer){
         foreach($answer->examQuizAnswers->get() as $quiz){
           $count = $quiz->where('is_correct_answer',1)->count()
        }
      }
     @endphp
      <td>{{$count}}</td>
  </tr>
@endforeach

当然,您可以在模型中编写一个方法来检索正确答案。而是调用该方法。 您可以在 User 模型中编写这样的方法:

public function get_correct_answers($user_id){

      $user = User::whereId($user_id)->first();
        foreach($user->submittedAnswers()->get() as $answer){
         foreach($answer->examQuizAnswers->get() as $quiz){
           $count = $quiz->where('is_correct_answer',1)->count()
        }
      }
return $count;
}

然后在视图中,您只需像这样调用该方法:

 <tr>
        <th>Name</th>
        <th>Answered</th>
        <th>Correct</th>
    </tr>
    @foreach($users as $user)
      <tr>
          <td>{{$user->name}}</td>
          <td>{{count($user->submittedAnswers()->get())}}</td>
          <td>{{$user->get_correct_answers($user->id)}}</td>
      </tr>
    @endforeach

【讨论】:

  • 我刚刚注意到我在 SubmittedAnswer 和 ExamQuizAnswer 和 ExamQuiz 之间有错误的关系。 ExamQuizAnswer 和 ExamQuiz 的表中都没有提交的答案 ID 列。所以来自 SubmittedAnswer 的 hasMany() 关系是不可能的......
  • 我刚刚将关系从 hasMany() 更改为 belongsTo()。
  • @Eisenheim 很高兴我能提供帮助;)
  • 非常感谢。另外,如何根据正确答案的总数对结果进行排序?
  • 没关系。我为此创建了一个新表并存储了相应的值。我现在可以按我的意愿对它们进行排序:)
【解决方案2】:

循环您的 $users 并回显您想要的 3 个字段。大致是这样的:

{{ $user->name }}
{{ $user->submittedAnswers->examQuizAnswers()->where('is_correct_answer', 1)->get()->count() }}
{{ $user->submittedAnswers->examQuizAnswers->count() }}

但请不要为了孩子们实际在视图文件中查询。

在控制器中预加载相关模型:

User::with(['submitted_answers', 'submitted_answers.exam_quiz_answers'])->get()

【讨论】:

  • 我刚刚注意到我在 SubmittedAnswer 和 ExamQuizAnswer 和 ExamQuiz 之间有错误的关系。 ExamQuizAnswer 和 ExamQuiz 的表中都没有提交的答案 ID 列。所以来自 SubmittedAnswer 的 hasMany() 关系是不可能的......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-30
  • 1970-01-01
  • 2014-06-02
相关资源
最近更新 更多