【问题标题】:The radio button value cannot be inserted into database. How can I solve this?单选按钮值无法插入数据库。我该如何解决这个问题?
【发布时间】:2021-05-23 05:21:29
【问题描述】:

我正在构建一个调查应用程序,用户只能选择以下选项之一:1 = 非常不同意,2 = 非常同意,3 = 不同意或不同意,4 = 同意,5 = 非常同意。

我正在使用 Laravel,其中 principal_questionnaires 是父表,checklists 是子表。 我想要实现的是当用户选中其中一个单选按钮时,必须将单个数字(无论是 1、2、3、4 还是 5)作为值插入到清单列中的清单表中。但是当我单击提交时,清单值返回 null。我为这个问题苦苦挣扎了 3 周。我在 3 周内为此做了很多研究,但没有肯定的结果。任何人都可以帮助解决这个问题吗?

下面是我的代码:

问卷口才模型

<?php
  namespace App;

  use Illuminate\Database\Eloquent\Model;

  //questionnaire model
  class PrincipalQuestionnaire extends Model{

  protected $fillable = ['questionnaires'];

  protected $casts = [
    'created_at' => 'datetime',
    'updated_at' => 'datetime',
  ];

   //questionnaire has many checklists
  public function surveyChecklists() {
    return $this->hasMany(SurveyChecklist::class, 'principal_questionnaire_id', 'id');
  }
}

清单 Eloquent 模型

class SurveyChecklist extends Model
{

public $table = 'survey_checklists';

protected $fillable = [
    'user_id', 'principal_questionnaire_id', 'checklist'
];

protected $casts = [
    'created_at' => 'datetime',
    'updated_at' => 'datetime',
];

//checklists belong to a questionnaire
public function principalQuestionnaire()
{
    return $this->belongsTo(PrincipalQuestionnaire::class, 'principal_questionnaire_id');
}

控制器的存储操作

public function store(Request $request)
{
    $form_data = array(
        'user_id' =>  Auth::user()->id,
        'principal_questionnaire_id' => $request->principal_questionnaire_id,
        'checklist' => $request->checklist
    );
    
    SurveyChecklist::create($form_data);

刀片页面

 @foreach($principal->principalQuestionnaires as $mysurvey)
     <div class="row survey-row">
       <div class="col-md-7">
          <p>
             {{ $mysurvey->questionnaires }}
          </p>
       </div>
                                        
       <div class="col-md-1">
          <label class="radio-inline">
            <input type="radio" name="checklist{{ $mysurvey->id }}" value="1" class="form- 
             check-input" required>
            <input type="hidden" name="user_id" value="{{ old('user_id', isset($questionnire) ? 
             $questionnire->user_id : '') }}">
            <input type="hidden" name="principal_questionnaire_id" value="{{ $mysurvey->id }}">
          </label>
       </div>
       <div class="col-md-1">
          <label class="radio-inline">
            <input type="radio" name="checklist{{ $mysurvey->id }}" value="2" class="form- 
             check-input" required>
          </label>
       </div>
       <div class="col-md-1">
          <label class="radio-inline">
           <input type="radio" name="checklist{{ $mysurvey->id }}" value="3" class="form- 
           check-input" required>
          </label>
       </div>
       <div class="col-md-1">
          <label class="radio-inline">
            <input type="radio" name="checklist{{ $mysurvey->id }}" value="4" class="form- 
              check-input" required>
          </label>
       </div>
       <div class="col-md-1">
          <label class="radio-inline">
             <input type="radio" name="checklist{{ $mysurvey->id }}" value="5" class="form- 
              check-input" required>
           </label>
       </div>
     </div>
   @endforeach

浏览器上的页面

这是抛出的异常:

Illuminate\Database\QueryException
SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'checklist' cannot be null (SQL: insert 
into `survey_checklists` (`user_id`, `principal_questionnaire_id`, `checklist`, `updated_at`, 
`created_at`) values (1, 39, ?, 2021-02-20 10:59:12, 2021-02-20 10:59:12))

【问题讨论】:

  • 将 name="checklist{{ $mysurvey->id }}" 更改为 name="checklist"。这就是你需要做的所有事情
  • 我按照您的建议进行了尝试,但现在收音机的行为发生了变化。它现在只检查整个应用程序一次。并将其他行留空。

标签: php mysql laravel eloquent radio-button


【解决方案1】:

尝试在您的控制器上工作。 'checklist'=&gt;$request-&gt;checklist 似乎不起作用。我对 Laravel 不是很有经验,但我想这就是问题所在,因此返回 null。

所以试试'checklist'=&gt;$request['checklist'.$mysurvey-&gt;id]

于是store函数就变成了

public function store(Request $request)
{
    $form_data = array(
        'user_id' =>  Auth::user()->id,
        'principal_questionnaire_id' => $request->principal_questionnaire_id,
        'checklist'=>$request['checklist'.$mysurvey->id]
    );
    
    SurveyChecklist::create($form_data);
}

【讨论】:

    【解决方案2】:

    问题来了:

     name="checklist{{ $mysurvey->id }}"
    

    加载 html 时,名称变为“checklist1”,当您点击提交时,您没有输入名称为 checklist,因为您的所有输入都变成了 checklist1、checklist2 等。

    要修复此输入尝试:

     <input type="radio" name="checklist" value="{{ $mysurvey->id }}" class="form- 
              check-input" required>
    

    另外,如果你想有多个检查,你需要把检查表做成一个数组:

        <input type="radio" name="checklist[{{ $mysurvey->id }}]" value="{{ $mysurvey->id }}" class="form- 
              check-input" required>
    

    提交后,在控制器循环中使用foreach$request-&gt;checklist 保存选定的清单

    【讨论】:

    • 此代码将显示错误行为在 foreach 循环内部。这就是我回答@Masih Ansari
    • 如果你想遍历它,把它做成一个数组,就像我在第二个例子中演示的那样。如果清单可能只有 1 个值,则不需要数组。
    猜你喜欢
    • 2017-07-02
    • 2016-02-06
    • 1970-01-01
    • 1970-01-01
    • 2020-03-25
    • 2020-02-14
    相关资源
    最近更新 更多