【发布时间】:2020-06-19 07:13:45
【问题描述】:
大家好,我遇到了一个对我来说有点“奇怪”的问题。一点背景:
我正在为考试创建一个表格,其中有一个问题,并附有 description、iframe、image 字段,图片是可选的。这些问题反过来也会有自己的领域description、iframe、image。
- 为此,我所做的是,在表单中创建一个数组
question[]到 存储该表的字段,因为它们是question[description],question[iframe]和question[image] - 对于答案应用类似的东西,二维数组
answers[][]在一个中我保留答案的索引,在另一个中 字段,我的字段是answers[][description]、answers[][iframe]和answers[][image] - 当您尝试仅插入描述和视频时
问题,没有问题。问题在于回复,
并非全部保存字段。就部分而言
answers[][description]第一个字段保存,第二个不保存 更长,第三个有,第四个没有。 - 在
answers[][iframe]中发生了同样的事情,除了第一个 字段不保存,第二个不保存,第三个不保存 第四个。
在下图中可以更好地看到问题: enter image description here
还有可以看到问题字段的图片: enter image description here
我的模特Question:
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Question extends Model
{
protected $fillable = [
'description', 'iframe', 'image' ,'exam_id'
];
protected $guarded = [];
public function Exam()
{
return $this->belongsTo(Exam::class);
}
public function answers()
{
return $this->hasMany(Answer::class);
}
}
我的模特Answers:
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Answer extends Model
{
protected $fillable = [
'description', 'iframe', 'question_id'
];
protected $guarded = [];
public function question()
{
return $this->belongsTo(Question::class);
}
}
QuestionController:
<?php
namespace App\Http\Controllers;
use App\Exam;
use App\Http\Requests\QuestionRequest;
use Illuminate\Http\Request;
use App\Question;
use function GuzzleHttp\Promise\all;
class QuestionController extends Controller
{
public function create(Exam $exam)
{
return view('question.create', compact(['exam']));
}
public function store(Exam $exam, QuestionRequest $request)
{
$data = request()->validate([
'question.description' => 'required',
'question.iframe' => 'required',
'answers.*.description' => 'required',
'answers.*.iframe' => 'required',
]);
dd($data);
$question = $exam->questions()->create($data['question']);
$question->answers()->createMany($data['answers']);
return redirect('/exams/' . $exam->id);
}
}
我正在使用自定义Request 文件:
<?php
namespace App\Http\Requests;
use Illuminate\Foundation\Http\FormRequest;
class QuestionRequest extends FormRequest {
/**
* Determine if the user is authorized to make this request.
*
* @return bool
*/
public function authorize()
{
return true;
}
public function rules()
{
return [
'question.description' => 'required',
'question.iframe' => 'required',
'answers.*.description' => 'required',
'answers.*.iframe' => 'required',
];
}
public function messages()
{
return[
'question.description.required' => 'Debes agregar una descripcion al campo Descripcion.',
'question.iframe.required' => 'Debes agregar el link del video al campo Video Asociado.',
'answers.*.description.required' => 'Debes agregar una respuesta en el campo Respuesta',
'answers.*.iframe.required' => 'Debes agregar un video en el campo Video Asociado'
];
}
}
我的迁移
Answers
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreateAnswersTable extends Migration{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('answers', function (Blueprint $table) {
$table->id();
$table->bigInteger('question_id')->unsigned();
$table->text('description');
$table->text('iframe');
$table->text('image')->nullable();
$table->timestamps();
$table->foreign('question_id')->references('id')->on('questions');
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('answers');
}
}
Questions
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreateQuestionsTable extends Migration{
/**
* Run the migrations.
*
* @return void
*/
public function up(){
Schema::create('questions', function (Blueprint $table) {
$table->id();
$table->bigInteger('exam_id')->unsigned();
$table->text('description');
$table->text('iframe');
$table->text('image')->nullable();
$table->timestamps();
$table->foreign('exam_id')->references('id')->on('exams');
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('questions');
}
}
最后我的观点create.blade.php:
@extends('layouts.app')
@section('content')
<div class="container">
<div class="row justify-content-center">
<div class="col-md-12">
<div class="card">
<div class="card-header">
<span>Crear nueva pregunta</span>
<a href="/exams/" class="btn btn-secondary btn-sm float-right" onclick="return confirm('Tus datos se perderan ¿Deseas regresar a la pagina principal?')">Regresar</a>
</div>
<div class="card-body">
@if($errors->any())
<div class="alert alert-danger">
<h6>Por favor, verifica que los campos esten llenos</h6>
</div>
@endif
<form action="/exams/{{ $exam->id }}/questions" method="POST" enctype="multipart/form-data">
@CSRF
<input hidden name="user_id" value="{{ auth()->user()->id }}">
<div class="form-group">
<label for="description">Descripcion de la pregunta *</label>
<textarea name="question[description]" type="text" class="form-control" id="description" aria-describedby="descriptionHelp" placeholder="Inserte la pregunta">{{ old('question.description') }}</textarea>
<small id="descriptionHelp" class="form-text text-muted">Escribe la descripcion de la pregunta.</small>
@if($errors->has('question.description'))
<div class="alert alert-danger">
{{ $errors->first('question.description') }}
</div>
@endif
</div>
<div class="form-group">
<label for="iframe">Video asociado *</label>
<textarea name="question[iframe]" type="text" class="form-control" id="iframe" aria-describedby="iframeHelp" placeholder="Inserte la URL del video">{{ old('question.iframe') }}</textarea>
<small id="iframeHelp" class="form-text text-muted">Inserta la url del video.</small>
@if($errors->has('question.iframe'))
<div class="alert alert-danger">
{{ $errors->first('question.iframe') }}
</div>
@endif
</div>
{{-- <div class="form-group d-flex flex-column">
<label for="image">Imagen asociada</label>
<input name="question[image]" type="file" class="py-2">
</div> --}}
<hr>
<legend>Respuestas</legend>
<span id="choiceHelp" class="form-text text-muted">Por favor ingresa las posibles respuestas.</span>
<br>
<div class="form-group">
<div class="form-group">
<label for="option1" style="font-size: 17px;">Opcion A</label>
<textarea name="answers[][description]" type="text" class="form-control" id="option1" aria-describedby="optionHelp" placeholder="Inserte la primera respuesta">{{ old('answers.0.description') }}</textarea>
</div>
@if($errors->has('answers.0.description'))
<div class="alert alert-danger">
{{ $errors->first('answers.0.description') }}
</div>
@endif
<div class="form-group">
<label for="iframe">Video asociado *</label>
<textarea name="answers[][iframe]" class="form-control" id="iframe" aria-describedby="iframeHelp" placeholder="Inserte la URL del video" >{{ old('answers.0.iframe') }}</textarea>
</div>
@if($errors->has('answers.0.iframe'))
<div class="alert alert-danger">
{{ $errors->first('answers.0.iframe') }}
</div>
@endif
{{--<div class="form-group">
<input name="image[question]" type="file">
</div> --}}
</div>
<hr><br>
<div class="form-group">
<div class="form-group">
<label for="option2" style="font-size: 17px;">Opcion B</label>
<textarea name="answers[][description]" type="text" class="form-control" id="option2" aria-describedby="optionHelp" placeholder="Inserte la segunda respuesta" >{{ old('answers.1.description') }}</textarea>
@if($errors->has('answers.1.description'))
<div class="alert alert-danger">
{{ $errors->first('answers.1.description') }}
</div>
@endif
</div>
<div class="form-group">
<label for="iframe">Video asociado *</label>
<textarea name="answers[][iframe]" class="form-control" id="iframe" aria-describedby="iframeHelp" placeholder="Inserte la URL del video">{{ old('answers.1.iframe') }}</textarea>
@if($errors->has('answers.1.description'))
<div class="alert alert-danger">
{{ $errors->first('answers.1.iframe') }}
</div>
@endif
</div>
{{-- <div class="form-group">
<input name="image[question]" type="file">
</div> --}}
</div>
<hr><br>
<div class="form-group">
<div class="form-group">
<label for="" style="font-size: 17px;">Opcion C</label>
<textarea name="answers[][description]" type="text" class="form-control" id="option3" aria-describedby="optionHelp" placeholder="Inserte la tercera respuesta">{{ old('answers.2.description') }}</textarea>
@if($errors->has('answers.2.description'))
<div class="alert alert-danger">
{{ $errors->first('answers.2.description') }}
</div>
@endif
</div>
<div class="form-group">
<label for="iframe">Video asociado *</label>
<textarea name="answers[][iframe]" class="form-control" id="iframe" aria-describedby="iframeHelp" placeholder="Inserte la URL del video">{{ old('answers.2.iframe') }}</textarea>
@if($errors->has('answers.2.iframe'))
<div class="alert alert-danger">
{{ $errors->first('answers.2.iframe') }}
</div>
@endif
</div>
{{-- <div class="form-group">
<input name="image[question]" type="file">
</div> --}}
</div>
<hr><br>
<div class="form-group">
<div class="form-group">
<label for="" style="font-size: 17px;">Opcion D</label>
<textarea name="answers[][description]" type="text" class="form-control" id="option4" aria-describedby="optionHelp" placeholder="Inserte la cuarta respuesta">{{ old('answers.3.description') }}</textarea>
@if($errors->has('answers.3.description'))
<div class="alert alert-danger">
{{ $errors->first('answers.3.description') }}
</div>
@endif
</div>
<div class="form-group">
<label for="iframe">Video asociado *</label>
<textarea name="answers[][iframe]" class="form-control" id="iframe" aria-describedby="iframeHelp" placeholder="Inserte la URL del video">{{ old('answers.3.iframe') }}</textarea>
@if($errors->has('answers.3.iframe'))
<div class="alert alert-danger">
{{ $errors->first('answers.3.iframe') }}
</div>
@endif
</div>
{{-- <div class="form-group">
<input name="image[question]" type="file">
</div> --}}
</div>
<hr><br>
<button type="submit" class="btn btn-primary">Agregar pregunta</button>
</form>
</div>
</div>
</div>
</div>
</div>
@endsection
更新 发送表单时添加 dd($data)
array:4 [▼
"_token" => "rpKkqpr9zmE7Q1ZN8L9CkQ42HJcDY4oi35aDhAqv"
"user_id" => "1"
"question" => array:2 [▼
"description" => "https://youtu.be/ArMga9b77Fs"
"iframe" => "https://youtu.be/y2TAeAzeqo4"
]
"answers" => array:8 [▼
0 => array:1 [▼
"description" => "weuohqwepqjwe"
]
1 => array:1 [▼
"iframe" => "https://youtu.be/k7ORQhXN9rQ"
]
2 => array:1 [▼
"description" => "ouwhdouhqw"
]
3 => array:1 [▼
"iframe" => "https://youtu.be/1_nHJPGJvIo"
]
4 => array:1 [▼
"description" => "iuoashdahsoduasd"
]
5 => array:1 [▼
"iframe" => "https://youtu.be/k7ORQhXN9rQ"
]
6 => array:1 [▼
"description" => "wiodjoiashd"
]
7 => array:1 [▼
"iframe" => "https://youtu.be/k7ORQhXN9rQ"
]
]
]
还有图片。
【问题讨论】:
-
请您从您的控制器方法中显示
dd($data);的输出。 -
当然,我正在更新 mi 问题并添加 dd($data)。