【问题标题】:Update() function in the Laravel Resource Controller is not workingLaravel 资源控制器中的 Update() 函数不起作用
【发布时间】:2020-03-11 09:45:26
【问题描述】:

所以我正在尝试使用 update() 函数来更新选定的用户,但是当我单击提交时,它只是返回到索引(应该如此)但什么也不更新。以下是我的代码:

StudentController(资源控制器):

 <?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

use App\Student;

class StudentController extends Controller
{
    /**
     * Display a listing of the resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function index()
    {
        $students = Student::all();
        return view ('main',compact('students'));
    }
/**
 * Show the form for creating a new resource.
 *
 * @return \Illuminate\Http\Response
 */
public function create()
{
    return view ('create');
}

/**
 * Store a newly created resource in storage.
 *
 * @param  \Illuminate\Http\Request  $request
 * @return \Illuminate\Http\Response
 */
public function store(Request $request)
{
    Student::create($request->all());
    return redirect()->route('main.index')->with('create','Student has been added successfully!');
}

/**
 * Display the specified resource.
 *
 * @param  int  $id
 * @return \Illuminate\Http\Response
 */
public function show($id)
{
    //
}

/**
 * Show the form for editing the specified resource.
 *
 * @param  int  $id
 * @return \Illuminate\Http\Response
 */
public function edit($id, Student $student)
{
    $student = Student::findOrFail($id);
    return view ('edit',compact('student'));
}

/**
 * Update the specified resource in storage.
 *
 * @param  \Illuminate\Http\Request  $request
 * @param  int  $id
 * @return \Illuminate\Http\Response
 */
public function update(Request $request, Student $student)
{
    $student->update($request->all());
    return redirect()->route('main.index')->with('update','Student has been updated!');
}

/**
 * Remove the specified resource from storage.
 *
 * @param  int  $id
 * @return \Illuminate\Http\Response
 */
public function destroy($id)
{
    //
}
}

Main.blade.php(索引):

<div class="container">
<div class="row">
    <div class="col-lg-12">
        <div class="py-4">
            @if (Session::has('create'))
                <div class="alert alert-info">
                    {{ Session::get('create') }}
                </div>
            @endif
            @if (Session::has('update'))
                <div class="alert alert-info">
                    {{ Session::get('update') }}
                </div>
            @endif
        <div class="card">
            <div class="card-header">
                Students
                {{ link_to_route('main.create','Add Student','',['class'=>'btn btn-success float-right']) }}
            </div>
            <div class="card-body">
                    <table id="myTable" class="table table-striped table-bordered">
                        <thead>
                    <tr>
                    <th>Student Name</th>
                    <th>Gender</th>
                    <th>Address</th>
                    <th>Class</th>
                    <th>Action</th>
                    </tr>
                        </thead>
                        <tbody>
                        @foreach($students as $student)
                    <tr>
                        <td>{{ $student->name }}</td>
                        <td>{{ $student->gender }}</td>
                        <td>{{ $student->address }}</td>
                        <td>{{ $student->class }}</td>
                    <td>{{ link_to_route('main.edit','Edit',[$student->id],['class'=> 'btn btn-primary btn-sm']) }}</td>
                    </tr>
                        @endforeach
                        </tbody>
                </table>
            </div>
        </div>
    </div>
</div>

edit.blade.php(模型):

{!! Form::model($student,array('route'=>['main.update',$student->id],'method'=>'PUT')) !!}
                    <div class="form-group">
                        {!! Form::text('name',null,['class'=>'form-control','placeholder'=>'Add Student Name']) !!}
                    </div>
                    <div class="form-group">
                        {!! Form::select('gender', [
                         'Male' => 'Male',
                         'Female' => 'Female'],
                          null, ['class'=>'custom-select','placeholder' => 'Choose Gender']); !!}
                          </div>
                    <div class="form-group">
                        {!! Form::text('address',null,['class'=>'form-control','placeholder'=>'Add Student Address']) !!}
                    </div>
                    <div class="form-group">
                   {!! Form::select('class', [
                    'A' => 'A',
                    'B' => 'B',
                    'C' => 'C',
                    'D' => 'D',],
                     null, ['class'=>'custom-select','placeholder' => 'Choose Class']); !!}
                     </div>
                     <div class="form-group py-4">
                        {!! Form::submit('Edit',['type'=>'submit','class'=>'btn btn-danger btn-block']) !!}
                    </div>
                    {!! Form::close() !!}

Student.php(模型):

  <?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Student extends Model
{
    protected $fillable = ['name','gender','address','class'];
}

我的 create.blade.php 与我的 edit.blade.php 完全相同,唯一的变化是在 Form::open() 行中。编辑页面甚至在输入字段上显示我的旧数据,但是当我进行更改并单击更新时,它不会更新数据库或索引页面中的任何内容 - 那我做错了什么?在此先感谢您,请随时询问是否需要更多代码才能破解此代码。

【问题讨论】:

  • 更新时不会出现任何错误吗?
  • 向我们展示 dd($request->all()); 的输出从你的 update() 函数
  • dd($student) 得到什么?
  • 是否显示更新警报?在更新模型前后尝试 dd($student->getAttributes()) 看是否有变化。
  • 当我在 update() 中执行此操作时:dd($student-&gt;getAttributes()); $student-&gt;update($request-&gt;all()); dd($student-&gt;getAttributes()); return redirect()-&gt;route('main.index')-&gt;with('update','Student has been updated!'); 它返回一个空数组[]

标签: php laravel


【解决方案1】:

在你的edit.blade.php

{!! Form::submit('route_to_update()',['type'=>'submit','class'=>'btn btn-danger btn-block']) !!}  

更改“编辑” 您可以在控制台中检查您的路线,例如“php artisan route:list

并检查您的路线是否到达 通过var_damp()var_export()dd()在您的学生控制器更新功能中

【讨论】:

    【解决方案2】:

    试试..

       public function update(Request $request,$id)
        {
        $student =  Student::find($id);
        $student->name = $request->input('name');
        $student->gender = $request->input('gender');
        $student->address = $request->input('address');
        $student->class = $request->input('class');
        $student->save();
        return redirect()->route('main.index')->with('update','Student has been updated!');
        }
    

    【讨论】:

    • @VenoM 您应该使用 only(['name', 'gender', 'address', 'class']) 而不是获取每个值,并且您的类型提示是正确的,但您只是删除了它:(!
    【解决方案3】:

    request()-&gt;all() 包含方法和令牌信息。你可以通过验证器传递它吗?

    $validated = request()->validate([
    'name' => 'required',
    'address' => '',
    ..
    ]);
    $student->update($validated);
    

    【讨论】:

      【解决方案4】:

      试试这个:

      public function update(Request $request, Student $student)
      {
          $input = $request->all();
          $student->fill($input)->save();
      
       return redirect()->route('main.index')->with('update','Student has been updated!');
      }
      

      【讨论】:

      • 为什么将-&gt;update() 替换为fill()-&gt;save()。它的作用完全一样,但更长且不那么容易阅读。
      猜你喜欢
      • 2020-11-19
      • 2017-03-14
      • 1970-01-01
      • 2022-12-20
      • 2020-01-26
      • 1970-01-01
      • 1970-01-01
      • 2014-05-29
      • 1970-01-01
      相关资源
      最近更新 更多