【问题标题】:How can I get seprate quiestion ID in foreach loop?如何在 foreach 循环中获取单独的问题 ID?
【发布时间】:2020-01-12 13:46:06
【问题描述】:

我是 laravel 的新手,我正在 laravel 中制作测验应用程序,我遇到了这个问题

@include('inc.header')
<br>
    <div class="container">
        <div class="row">
            <form method="POST" action="{{ url('/store-quiz') }}" class="" id="quiz_module">
            {{ csrf_field() }}      
                @foreach($questions as $question)
                    @if($id == $question->category_id)
                        <legend> Quiz Of {{ $question->category->title }}</legend>
                            <div class="jumbotron">
                                <input type="hidden" name="user_id" value="{{ auth()->user()->id }}">
                                <input type="hidden" name="category_id" value="{{ $question->category_id }}">
                                <input type="hidden" name="question_id" value="{{ $question->id }}">
                                <h4> 
                                    Question {{ $question->id }}
                                </h4>
                                <h3>
                                    {{ $question->question }}
                                </h3><brx`>
                                <h5>
                                    &emsp;<input type="radio" name="user_answer" class="form-check-input"  value="{{ $question->option_a }}">{{ $question->option_a }}<br>
                                    &emsp;<input type="radio" name="user_answer" class="form-check-input" value="{{ $question->option_b }}">{{ $question->option_b }}<br>
                                    &emsp;<input type="radio" name="user_answer" class="form-check-input" value="{{ $question->option_c }}">{{ $question->option_c }}<br>
                                    &emsp;<input type="radio" name="user_answer" class="form-check-input" value="{{ $question->option_d }}">{{ $question->option_d }}<br>
                                </h5>
                            </div>
                    @endif
                @endforeach
        </div>
            <button type="submit" class="btn btn-primary">Submit</button>
            </form>
    </div>
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.1.0/jquery.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/1000hz-bootstrap-validator/0.11.5/validator.min.js"></script>
<script type="text/javascript">
$("#quiz_module").click(function(){
    var url = $(this).attr("action");
    $.ajax({
        url: "/store-answer",
        type:"POST",
        data: $('form').serialize(),
    }); //end of ajax
});
$.ajaxSetup({
    headers: {
        'X-CSRF-TOKEN': $('meta[name="csrf_token"]').attr('content')
    }
});
</script>
@include('inc.footer')

你可以在这里看到我的输出https://prnt.sc/p4esh1

这里我从数据库中获取所有记录。当我点击任何单选按钮时,它将在数据库中存储 user_id、category_id、question_id 和答案。

但问题是每次都需要最后一个问题的问题 ID。

我想存储单独的问题 ID,例如如果我选择第二个问题的答案,然后在数据库中保存第二个问题的问题 ID,第三个问题也是如此。 但是这里每次都省3。

我该如何解决这个问题? 请指导我,谢谢!

在我的控制器中,我的代码如下所示

public function storeAnswer(Request $request)
    {
        $create = Quiz::create($request->all());
        return redirect('/home');
    }

【问题讨论】:

  • 请也分享一下你处理POST请求的方法的内容。
  • 这不是 laravel 的问题。这是基本的 html 表单问题。您输出相同的名称三次,只有最后一个会被使用。您需要使用表单数组。 php.net/manual/en/faq.html.php#faq.html.arrays
  • 我更新了我的问题,先生
  • 您是否尝试过将表单放入 foreach 中,以便为每个问题创建不同的表单。
  • @amindevloper 我认为这应该可以解决问题。可以试试吗?

标签: mysql laravel eloquent laravel-5.5


【解决方案1】:

仅凭这些信息我还不能完全理解您的代码,但请尝试以下操作:

在 foreach 循环中添加form,以便向单个 Quiz 对象发送请求。

这样:

@foreach($questions as $question)
    @if($id == $question->category_id)
        <legend> Quiz Of {{ $question->category->title }}</legend>
        <div class="jumbotron">
            <form method="POST" action="{{ url('/store-quiz') }}" id="quiz_module">
                <input type="hidden" name="user_id" value="{{ auth()->user()->id }}">
                <input type="hidden" name="category_id" value="{{ $question->category_id }}">
                <input type="hidden" name="question_id" value="{{ $question->id }}">
                <h4> 
                    Question {{ $question->id }}
                </h4>
                <h3>
                    {{ $question->question }}
                </h3><br>
                <h5>
                    &emsp;<input type="radio" name="user_answer" class="form-check-input"  value="{{ $question->option_a }}">{{ $question->option_a }}<br>
                    &emsp;<input type="radio" name="user_answer" class="form-check-input" value="{{ $question->option_b }}">{{ $question->option_b }}<br>
                    &emsp;<input type="radio" name="user_answer" class="form-check-input" value="{{ $question->option_c }}">{{ $question->option_c }}<br>
                    &emsp;<input type="radio" name="user_answer" class="form-check-input" value="{{ $question->option_d }}">{{ $question->option_d }}<br>
                </h5>
                <button type="submit" class="btn btn-primary">Submit</button>
            </form>
        </div>
    @endif
@endforeach

【讨论】:

  • 我仍然得到最后一个 question_id
  • Lucas,您的方法很有趣,但您必须稍微修复一下 html,并添加一些 js,以便按下提交按钮不会像默认情况那样重新加载页面,并且输入已经发送的都清空了。
  • @amindevloper,我想如果不重构您的整个代码,包括您在数据库中使用的架构,我将无法帮助您。但我可以告诉你,如果你为循环中的每个问题处理一个表单,你将能够在请求中获得正确的 ID,并将其正确地存​​储在控制器中。
  • 我会努力的
  • 好的,这里有几个问题。当你在循环中有元素时,你不能做id="quiz_module"; html 元素需要有唯一的ids。其次,问题中的 JS 引用了$("#quiz_module").on("click", ...);,它将找到带有id 的最后一个&lt;form&gt; 元素(同样,如果您有多个具有相同id 的元素,则会出现问题)。最后,$("form").serialize() 将定位页面上众多&lt;form&gt; 元素之一;需要针对特定​​的 &lt;form&gt; (通过轻松地将类添加到 &lt;form&gt; 并更改 `.on("click") 处理程序以定位它。
【解决方案2】:

我认为您必须在提交按钮上一起提交所有答案。请对您的代码进行以下更改。请注意: 1) 形式在 foreach 之外 2)提交按钮应该进入表单标签。 3) 将每个元素的名称转换成表格。

 <form method="POST" action="{{ url('/store-answer') }}" class="crud-submit" id="quiz_module">
        @foreach($questions as $i => $question)
     <?php

            print_r($question);
            ?>
                <legend> {{$i}} Quiz Of {{ $question['category']['title'] }}</legend>

                    <div class="jumbotron">
                        <input type="hidden" name="user_id" value="1">
                        <input type="hidden" name="que_module[{{$i}}]['category_id']" value="{{ $question['category_id'] }}">
                        <input type="hidden" name="que_module[{{$i}}]['question_id']" value="{{ $question['id'] }}">
                        <h4>
                            Question {{ $question['id'] }}
                        </h4>
                        <h3>
                            {{ $question['question'] }}
                        </h3><br>
                        <h5>
                            &emsp;<input type="radio" name="que_module[{{$i}}]['answer']" class="form-check-input"  value="{{ $question['option_a'] }}">{{ $question['option_a'] }}<br>
                            &emsp;<input type="radio" name="que_module[{{$i}}]['answer']" class="form-check-input" value="{{ $question['option_b'] }}">{{ $question['option_b'] }}<br>
                            &emsp;<input type="radio" name="que_module[{{$i}}]['answer']" class="form-check-input" value="{{ $question['option_c'] }}">{{ $question['option_c'] }}<br>
                            &emsp;<input type="radio" name="que_module[{{$i}}]['answer']" class="form-check-input" value="{{ $question['option_d'] }}">{{ $question['option_d'] }}<br>
                        </h5>
                    </div>


        @endforeach
         <button type="submit" class="btn btn-primary">Submit</button>
         </form>

你也必须改成jquery,如下所示。

$("#quiz_module").submit(function(e)
    {
        e.preventDefault();
            $.ajax({
                type: 'POST',
                dataType: 'json',

                url: '/store-answer',
                data: $("#quiz_module").serialize(),
                headers: {
                    'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
                },
            });
    });

您已将所有数据输入控制器,如下所示。

function storeAnswer(Request $req){
    print_r($req->all());
}

【讨论】:

  • 你可以得到如下响应: Array ( [user_id] => 1 [que_module] => Array ( [0] => Array ( ['category_id'] => 1 ['question_id'] => 1 ['answer'] => opt c ) [1] => 数组 ( ['category_id'] => 2 ['question_id'] => 2 ['answer'] => opt b 2 ) ) )
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多