【问题标题】:Some fields are not filled in laravellaravel 中有些字段没有填写
【发布时间】:2020-06-19 07:13:45
【问题描述】:

大家好,我遇到了一个对我来说有点“奇怪”的问题。一点背景:

我正在为考试创建一个表格,其中有一个问题,并附有 descriptioniframeimage 字段,图片是可选的。这些问题反过来也会有自己的领域descriptioniframeimage

  • 为此,我所做的是,在表单中创建一个数组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"
    ]
  ]
]

还有图片。

enter image description here

【问题讨论】:

  • 请您从您的控制器方法中显示dd($data); 的输出。
  • 当然,我正在更新 mi 问题并添加 dd($data)。

标签: php laravel eloquent


【解决方案1】:

您认为问题是:answers 数组的第一个索引在每次调用中都会递增,这就是为什么您有 4 个选项的 8 个值。

为这个视图试试这个代码:

@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>
                                        @for ($i = 0, $j = 'A'; $i < 4; $i++, $j++)
                                            <div class="form-group">

                                                <div class="form-group">
                                                    <label for="option{{ $i }}" style="font-size: 17px;">Opcion {{ $j }}</label>
                                                    <textarea name="answers[$i][description]" type="text" class="form-control" id="option{{ $i }}" aria-describedby="optionHelp" placeholder="Inserte la primera respuesta">{{ old('answers.$i.description') }}</textarea>
                                                </div>

                                                @if($errors->has('answers.$i.description'))
                                                    <div class="alert alert-danger">
                                                        {{ $errors->first('answers.$i.description') }}
                                                    </div>
                                                @endif

                                               <div class="form-group">
                                                    <label for="iframe">Video asociado *</label>
                                                    <textarea name="answers[$i][iframe]" class="form-control" id="iframe" aria-describedby="iframeHelp" placeholder="Inserte la URL del video" >{{ old('answers.$i.iframe') }}</textarea>
                                                </div>

                                                @if($errors->has('answers.$i.iframe'))
                                                    <div class="alert alert-danger">
                                                        {{ $errors->first('answers.$i.iframe') }}
                                                    </div>
                                                @endif

                                            {{--<div class="form-group">
                                                    <input name="image[question]" type="file">

                                                </div> --}}
                                            </div> 

                                            <hr><br>
                                        @endfor

                                <button type="submit" class="btn btn-primary">Agregar pregunta</button>

                            </form>
                        </div>
                    </div>
                </div>
            </div>
        </div>
@endsection

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-11-14
    • 2018-11-21
    • 2014-09-22
    • 2016-04-06
    • 1970-01-01
    • 1970-01-01
    • 2019-07-22
    • 1970-01-01
    相关资源
    最近更新 更多