Php 迁移导致问题的可空字段
我已经创建了一个名为“create_modules_table”的迁移,请参见下面的代码Php 迁移导致问题的可空字段,php,laravel,Php,Laravel,我已经创建了一个名为“create_modules_table”的迁移,请参见下面的代码 public function up() { Schema::create('modules', function (Blueprint $table) { $table->id(); $table->unsignedBigInteger('course_id')->nullable(); $t
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“课程id”。如果没有“nullable”,我会遇到一个与“course_id”没有默认值相关的错误。所以我添加了“nullable”。但是现在它又给我带来了更多的问题,当我创建一个新模块并选择要附加到模块的课程时,DB中的字段为空(尽管从我的表单中选择了一个现有课程)。我为上下文添加了一个图像。谁能告诉我哪里出了问题?我不知道如何着手解决这个问题
Module.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');
}
}
在表单中没有名为course\u id
的字段,而是名为course[]
的字段,这是一个多选字段,因此在使用模块::create($request->all())时,在存储方法中
在模块
模型中的$fillable
数组中没有字段匹配,因此您需要手动映射字段,而且,由于您使用的是数组(因为multi-select生成数组),因此您需要使用数组中的单个元素来创建关系
因此,一个简单的方法可以是():
我认为您缺少了一些东西,您不应该对外键使用多选
,除非您有一个多对多
关系,在这种情况下,您将在透视表中创建/附加多个相关条目。在您的表单中没有名为课程id
的字段,而是名为课程[]
这是一种多选,因此在您使用模块::create($request->all())时,在您的存储方法中
在模块
模型中的$fillable
数组中没有字段匹配,因此您需要手动映射字段,而且,由于您使用的是数组(因为multi-select生成数组),因此您需要使用数组中的单个元素来创建关系
因此,一个简单的方法可以是():
我认为您缺少一些东西,您不应该对外键使用multi-select
,除非您具有many-to-many
关系,在这种情况下,您将在透视表中创建/附加多个相关条目
<?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
}
}
@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
@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
Module::create([
'title' => $request->input('title'),
'course_id' => reset($request->input('course')) // get the first item from array
]);