laravel - переключатель / флажок, передающий неправильное значение в базу данных - PullRequest
0 голосов
/ 22 февраля 2019

Я создаю веб-сайт опроса, после создания нового опроса и выбора типа вопроса и добавления вопроса и параметров.Я хочу проверить, принимаю ли я участие в опросе, и все ответы будут сохранены в базе данных.Я пробовал, но проблема заключалась в каких-либо ответах на вопрос (с типом переключателя / флажка), значение, которое было сохранено в базе данных, «включено».Текст / текстовая область была сохранена правильно.Но не мог понять, как я могу это исправить.Независимо от того, что я выберу, значение будет «включено».

Это мой answerController.php:

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Survey;
use App\Answer;
use App\Http\Requests;


class AnswerController extends Controller
{

  public function store(Request $request, Survey $survey)
  {
    // remove the token
    $arr = $request->except('_token');
    foreach ($arr as $key => $value) {
      $newAnswer = new Answer();
      if (! is_array( $value )) {
        $newValue = $value['answer'];
      } else {
        $newValue = json_encode($value['answer']);
      }
      $newAnswer->answer = $newValue;
      $newAnswer->question_id = $key;
      $newAnswer->survey_id = $survey->id;

      $newAnswer->save();

      $answerArray[] = $newAnswer;
    };
    return redirect()->action('SurveyController@view_survey_answers', [$survey->id]);
  }
}

Это ответ Модель:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Answer extends Model
{
  protected $fillable = ['answer'];
  protected $table = 'answers';

  public function survey() {
    return $this->belongsTo(Survey::class);
  }

  public function question() {
    return $this->belongsTo(Question::class);
  }
}

Это код для создания вопроса и он выбирает тип:

@extends('master')
@section('title', 'Survey')

@section('content')
<div class="card">
    <div class="card-content">
    <span class="card-title"> {{ $survey->title }}</span>
    <p>
      {{ $survey->description }}
    </p>
    <br/>
    <a href='view/{{$survey->id}}'>Take Survey</a> | <a href="{{$survey->id}}/edit">Edit Survey</a> | <a href="/survey/answers/{{$survey->id}}">View Answers</a> <a href="#doDelete" style="float:right;" class="modal-trigger red-text">Delete Survey</a>
    <!-- Modal Structure -->
    <!-- TODO Fix the Delete aspect -->
    <div id="doDelete" class="modal bottom-sheet">
      <div class="modal-content">
        <div class="container">
          <div class="row">
            <h4>Are you sure?</h4>
            <p>Do you wish to delete this survey called "{{ $survey->title }}"?</p>
            <div class="modal-footer">
              <a href="/survey/{{ $survey->id }}/delete" class=" modal-action waves-effect waves-light btn-flat red-text">Yep yep!</a>
              <a class=" modal-action modal-close waves-effect waves-light green white-text btn">No, stop!</a>
            </div>
          </div>
        </div>
      </div>
    </div>
    <div class="divider" style="margin:20px 0px;"></div>
    <p class="flow-text center-align">Questions</p>
    <ul class="collapsible" data-collapsible="expandable">
        @forelse ($survey->questions as $question)
        <li style="box-shadow:none;">
          <div class="collapsible-header">{{ $question->title }} <a href="/question/{{ $question->id }}/edit" style="float:right;">Edit</a></div>
          <div class="collapsible-body">
            <div style="margin:5px; padding:10px;">
                {!! Form::open() !!}
                  @if($question->question_type === 'text')
                    {{ Form::text('title')}}
                  @elseif($question->question_type === 'textarea')
                  <div class="row">
                    <div class="input-field col s12">
                      <textarea id="textarea1" class="materialize-textarea"></textarea>
                      <label for="textarea1">Provide answer</label>
                    </div>
                  </div>
                  @elseif($question->question_type === 'radio')

                    @foreach($question->option_name as $key=>$value)
                      <p style="margin:0px; padding:0px;">
                        <input type="radio" id="{{ $key }}" />
                        <label for="{{ $key }}">{{ $value }}</label>
                      </p>
                    @endforeach
                  @elseif($question->question_type === 'checkbox')
                    @foreach($question->option_name as $key=>$value)
                    <p style="margin:0px; padding:0px;">
                      <input type="checkbox" id="{{ $key }}" />
                      <label for="{{$key}}">{{ $value }}</label>
                    </p>
                    @endforeach
                  @endif
                {!! Form::close() !!}
            </div>
          </div>
        </li>
        @empty
          <span style="padding:10px;">Nothing to show. Add questions below.</span>
        @endforelse
    </ul>
    <h2 class="flow-text">Add Question</h2>
    <form method="POST" action="{{ $survey->id }}/questions" id="boolean">
      <input type="hidden" name="_token" value="{{ csrf_token() }}">
      <div class="row">
        <div class="input-field col s12">
          <select class="browser-default" name="question_type" id="question_type">
            <option value="" disabled selected>Choose your option</option>
            <option value="text">Text</option>
            <option value="textarea">Textarea</option>
            <option value="checkbox">Checkbox</option>
            <option value="radio">Radio Buttons</option>
          </select>
        </div>
        <div class="input-field col s12">
          <input name="title" id="title" type="text">
          <label for="title">Question</label>
        </div>
        <!-- this part will be chewed by script in init.js -->
        <span class="form-g"></span>

        <div class="input-field col s12">
        <button class="btn waves-effect waves-light">Submit</button>
        </div>
      </div>
      </form>
  </div>
</div>

@endsection

И это файл JS:

$(document).ready(function() {
  $('.collapsible').collapsible({
    accordion: false
  });

  $('.modal-trigger').leanModal();

  $(document).on('click', '.delete-option', function() {
    $(this).parent(".input-field").remove();
  });

  // will replace .form-g class when referenced
  var material = '<div class="input-field col input-g s12">' +
    '<input name="option_name[]" id="option_name[]" type="text">' +
    '<span style="float:right; cursor:pointer;"class="delete-option">Delete</span>' +
    '<label for="option_name">Options</label>' +
    '<span class="add-option" style="cursor:pointer;">Add Another</span>' +
    '</div>';

  // for adding new option
  $(document).on('click', '.add-option', function() {
    $(".form-g").append(material);
  });
  // allow for more options if radio or checkbox is enabled
  $(document).on('change', '#question_type', function() {
    var selected_option = $('#question_type :selected').val();
    if (selected_option === "radio" || selected_option === "checkbox") {
      $(".form-g").html(material);
    } else {
      $(".input-g").remove();
    }
  });
});

Я следовал учебному пособию, и он сказал: На данный момент типичныйотправка ответа может выглядеть следующим образом:

{
  4: {
    answer: "My answer"
  },
  5: {
    answer: "on"
  },
  6: {
    answer: "on"
  }
}

Таким образом, наша функция store (), part foreach ($ arr as $ key => $ value) проходит через вышеуказанный объект JSON, тогда ключ будетнапример, 4, тогда значением будет $ value ['answer']

Таким образом, мы можем выполнить итерацию и получить ключ, который относится к какому идентификатору вопроса, тогда ответхранится в $ value ['answer'].


^ Но он не решил эту проблему.

Таким образом, Radio и Checkbox будут массивом, а код непринять участие, которое пользователь выбирает из этих массивов.У вас есть идея, как я могу изменить AnswerController так, чтобы код принимал только тот, который выбрал пользователь?

Это answerController, который заботится о части магазина:

public function store(Request $request, Survey $survey)
  {
    // remove the token
    $arr = $request->except('_token');
    foreach ($arr as $key => $value) {
      $newAnswer = new Answer();
      if (! is_array( $value )) {
        $newValue = $value['answer'];
      } else {
        $newValue = json_encode($value['answer']);
      }
      $newAnswer->answer = $newValue;
      $newAnswer->question_id = $key;
      $newAnswer->survey_id = $survey->id;

      $newAnswer->save();

      $answerArray[] = $newAnswer;
    };
    return redirect()->action('SurveyController@view_survey_answers', [$survey->id]);
  }
}

И это таблица ответов:

public function up()
    {
        Schema::create('answers', function (Blueprint $table) {
            $table->increments('id');
            $table->integer('question_id');
            $table->integer('survey_id');
            $table->string('answer');
            $table->timestamps();
        });
    }

Может кто-нибудь помочь мне, пожалуйста?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...