Миграционные поля, вызывающие проблемы - PullRequest
0 голосов
/ 10 марта 2020

Я создал миграцию с именем 'create_modules_table', см. Код ниже.

public function up()
    {
        Schema::create('modules', function (Blueprint $table) {
            $table->id();
            $table->unsignedBigInteger('course_id')->nullable();
            $table->foreign('course_id')->references('id')->on('courses');
            $table->string('title');
            $table->timestamps();            
        });
    }

Я добавил FK 'course_id'. Без 'nullable' я столкнулся с ошибкой, связанной с 'course_id', не имеющей значения по умолчанию. Поэтому я добавил «обнуляемый». Однако теперь это доставляет мне дополнительные проблемы, когда я создаю новый модуль и выбираю курс для присоединения к модулю, поле в БД пустое (несмотря на выбор существующего курса из моей формы). Я добавил изображение для контекста. Может кто-нибудь сказать мне, где я иду не так? Я не уверен, как go исправить это. enter image description here

Модуль. php

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Module extends Model
{
    protected $fillable = [
        'title', 'course_id', 'created_at', 'updated_at',
    ];

    public function course()
    {
        return $this->belongsTo(Course::class, 'course_id');
    }
}

ModulesController;

<?php

namespace App\Http\Controllers\Admin;

use App\Module;
use App\Course;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;

class ModulesController extends Controller
{
    public function index(Request $request)
    {
        $modules = new module();
        if ($request->input('course_id')) {
            $modules = $modules->where('course_id', $request->input('course_id'));
        }

        $modules = $modules->all();
        return view('admin.module.index', compact('modules'));
    }

    public function create()
    {
        $courses = Course::all()->pluck('title', 'id');

        return view('admin.module.create', compact('courses'));
    }

    public function store(Request $request)
    {
        $module = Module::create($request->all());

        return redirect()->route('admin.modules.index', ['course_id' => $request->id]); //redirects to correct route by adding course_id in parameter 

    }

}

create.blade.php;

@extends('layouts.app')

@section('content')
    <div class="row justify-content-center">
        <div class="col-md-8">
            <div class="card">
                <div class="card-header">Create Module</div>
                <div class="card-body">

                        <form method="POST" action="{{ route('admin.modules.store') }}" enctype="multipart/form-data">
                            @csrf
                            <div class="form-group">
                                    <label class="required" for="name">Module Title</label>
                                    <input class="form-control" type="text" name="title" id="id" required>
                                    @if($errors->has('name'))
                                    <div class="invalid-feedback">
                                        {{ $errors->first('name') }}
                                    </div>
                                    @endif
                            </div>

                            <div class="form-group">
                                {!! Form::label('Courses', 'Course', ['class' => 'control-label']) !!}
                                {!! Form::select('Course[]', $courses, Request::get('Course'), ['class' => 'form-control select2', 'multiple' => 'multiple']) !!} 
                            </div>
                            <div class="form-group">
                            <button class="btn btn-danger" type="submit">
                                Save
                            </button>
                        </div>
                    </div>
                    </form>
                </div>
            </div>
@endsection

index.blade.php;

@extends('layouts.app')

@section('content')
    <div class="container">
        <div class="row justify-content-center">
        <div class="col-md-8">
            <p>

                <a href="{{ route('admin.modules.create') }}"><button type="button" class="btn btn-success">Create Module</button></a>

            </p>
            <div class="card">
            <div class="card-header">Modules</div>
            <div class="card-body">
                <div class="table-responsive">
                    <table class="table">
                        <thead>
                          <tr>
                            <th>ID</th>
                            <th>Module Title</th>
                            <th>Course Title</th>
                            <th>Instructor</th> 
                            <th></th>
                            <th></th>
                            <th></th>
                          </tr>
                        </thead>
                        <tbody>
                        @foreach($modules as $key => $module)
                            <tr>
                            <th scope="row">{{ $module->id }}</th>
                            <td>{{ $module->title }}</td>
                            <td>{{ $module->course->title ?? ''}}</td>
                            </tr>
                            @endforeach
                        </tbody>
                    </table>
        </div>
        </div>
        </div>
</div>
@endsection

Я хотел бы добавить, что ошибки нет, БД просто не отображается вход .. по какой-то причине. Любая помощь приветствуется.

1 Ответ

2 голосов
/ 10 марта 2020

В вашей форме нет поля с именем course_id, вместо этого у вас есть поле с именем Course[], которое является множественным выбором, поэтому в вашем store method при использовании Module::create($request->all()); нет поля соответствие в вашем массиве $fillable в модели Module, поэтому вам нужно сопоставить поля вручную, а также, поскольку вы используете массив (так как множественный выбор создает массив), вам нужно использовать один элемент из массива для создания отношение.

Итак, один простой подход может быть ():

Module::create([
    'title' => $request->input('title'),
    'course_id' => reset($request->input('course')) // get the first item from array
]);

Я думаю, что вы что-то упустили, вы не должны использовать multi-select для внешнего ключа, если вы не ' Если у вас есть отношение many-to-many, то в этом случае вы создадите / присоедините несколько связанных записей в сводной таблице.

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