首页 > 解决方案 > Laravel 表单显示正确的数据但在数据库中存储不正确的值

问题描述

我在我的网站上遇到了一个错误,我对如何修复它感到困惑.. 基本上我有一个创建课程的视图,我输入一个课程标题,然后为该课程分配一个讲师,然后单击保存。但是当我回到我的索引页面时......我分配的导师完全不同。看来我的选择肯定有问题,但我不确定如何修复它。我是 laravel 的新手,因此非常感谢任何帮助。

我添加了一张图片以尝试进一步解释我的问题,在这里我选择了一位讲师-

在此处输入图像描述

当我返回我的索引页面时,新创建的课程“测试”分配了管理员用户......我很困惑 -

在此处输入图像描述

创建.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 Course</div>
                <div class="card-body">

                        <form method="POST" action="{{ route('admin.courses.store') }}" enctype="multipart/form-data">
                            @csrf

                            <div class="form-group">
                                    <label class="required" for="name">Course Title</label>
                                    <input class="form-control" type="text" name="title" id="id" value="{{ old('title', '') }}" required>
                                    @if($errors->has('name'))
                                    <div class="invalid-feedback">
                                        {{ $errors->first('name') }}
                                    </div>
                                @endif
                            </div>


                            <div class="form-group {{ $errors->has('instructors') ? 'has-error' : '' }}">
                                <label class="required" for="name">Instructors</label>
                                    <select class="form-control select2" name="instructors[]" id="instructors" multiple>
                                        @foreach($instructors as $id => $instructors)
                                            <option value="{{ $id }}" {{ in_array($id, old('instructors', [])) ? 'selected' : '' }}>{{ $instructors }}</option>
                                        @endforeach
                                    </select>
                            </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-10">
            <p>
            @can('create_courses')
                <a href="{{ route('admin.courses.create') }}"><button type="button" class="btn btn-success">Create Course</button></a>
            @endcan('create_courses')
            </p>
            <div class="card">
                <div class="card-header">Courses</div>

                <div class="card-body">


                    <div class="table-responsive">
                    <table class="table">
                        <thead>
                          <tr>
                            <th>ID</th>
                            <th>Course Title</th>
                            <th>Instructor</th>
                            <th></th>
                            <th></th>
                            <th></th>
                          </tr>
                        </thead>
                        <tbody>
                        @foreach($course as $course)
                            <tr>
                            <th scope="row">{{ $course->id }}</th>
                            <td>{{ $course->title}}</td>
                           <td>{{ implode (', ', $course->instructors()->pluck('name')->toArray()) }}</td> 
                            <td> 
                                    @can('edit_courses')
                                    <a class="btn btn-xs btn-secondary" href="{{ route('admin.modules.index', $course->id) }}">
                                        Modules
                                    </a>
                                    @endcan
                            </td>
                            <td>
                                    @can('edit_courses')
                                    <a class="btn btn-xs btn-primary" href="{{ route('admin.courses.edit', $course->id) }}">
                                        Edit
                                    </a>
                                    @endcan
                            </td>
                            <td>
                                    @can('delete_courses')
                                    <form action="{{ route('admin.courses.destroy', $course->id) }}" method="POST" onsubmit="return confirm('Confirm delete?');" style="display: inline-block;">
                                        <input type="hidden" name="_method" value="DELETE">
                                        <input type="hidden" name="_token" value="{{ csrf_token() }}">
                                        <input type="submit" class="btn btn-xs btn-danger" value="Delete">
                                </form>
                                @endcan  
                                </td>
                            </tr>
                        @endforeach

                        </tbody>
                      </table> 
                    </div>
                </div>
            </div>
        </div>
        <!-- <div class="col-md-2 col-lg-2">
                <div class="list-unstyled">
                    <a href=""class="list-group-item">Courses</a>
                    <a href=""class="list-group-item">Modules</a>
                </div>
        </div> -->
    </div>
</div>
@endsection

课程控制器;

<?php

namespace App\Http\Controllers\Admin;

use Gate;
use App\User;
use App\Course;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\Input;


class CoursesController extends Controller
{
    public function __construct()
    {
        //calling auth middleware to check whether user is logged in, if no logged in user they will be redirected to login page
        $this->middleware('auth');
    }

    public function index()
    {
        if(Gate::denies('manage_courses')){
            return redirect(route('home'));
        }

        $courses = Course::all();
        return view('admin.course.index')->with('course', $courses); //pass data down to view
    }

    public function create()
    { 
        if(Gate::denies('create_courses')){
            return redirect(route('home'));
        }

        $instructors = User::whereHas('role', function ($query) { 
            $query->where('role_id', 2); })->get()->pluck('name'); //defining instructor variable to call in create.blade.php. Followed by specifying that only users with role_id:2 can be viewed in the select form by looping through the pivot table to check each role_id 

        return view('admin.course.create', compact('instructors')); //passing instructor to view
    }

    public function store(Request $request)
    {
        $course = Course::create($request->all()); //request all the data fields to store in DB
        $course->instructors()->sync($request->input('instructors', [])); //input method retrieves all of the input values as an array

        if($course->save()){
            $request->session()->flash('success', 'The course ' . $course->title . ' has been created successfully.');
        }else{
            $request->session()->flash('error', 'There was an error creating the course');
        }

        return redirect()->route ('admin.courses.index');
    }

    public function destroy(Course $course)
    {
        if(Gate::denies('delete_courses'))
        {
            return redirect (route('admin.course.index'));
        }

        $course->delete();
        return redirect()->route('admin.courses.index');
    }

    public function edit(Course $course)
    {
        if(Gate::denies('edit_courses'))
        {
            return redirect (route('admin.courses.index'));
        }

        $instructors = User::whereHas('role', function ($query) { 
            $query->where('role_id', 2); })->get()->pluck('name');

        //return view('admin.course.edit', compact('instructors'));

        return view('admin.course.edit', compact('instructors'))->with([
             'course' => $course
        ]);
    }

    public function update(Request $request, Course $course)
    {
        $course->update($request->all());

        if ($course->save()){
            $request->session()->flash('success', $course->title . ' has been updated successfully.');
        }else{
            $request->session()->flash('error', 'There was an error updating ' . $course->title);
        }
        return redirect()->route('admin.courses.index');
    }

    public function show(Course $course)
    {
        return view('admin.course.show', compact('course'));
    }

}

参考最新评论 - 在此处输入图像描述

标签: phplaravel

解决方案


您正在更新数据而key不是id

尝试这个

在控制器中

 $instructors = User::whereHas('role', function ($query) { 
            $query->where('role_id', 2); })->select('id','name')->get(); 

在刀片

您将需要instructors->id更新正确的值

@foreach($instructors as $id => $instructor)
<option value="{{ $instructor->id }}" {{ in_array($id, old('instructors', [])) ? 'selected' : '' }}>{{ $instructor->name }}
</option>
@endforeach

推荐阅读