第7节 Laravel-通过表单实现修改

7.1HTML添加链接
7.2 创建修改的表单页面
7.3 使用模型实现修改操作

7.1 给HTML添加链接

在 \resources\views\student\index.blade.php 中给修改添加 href 属性。

<a href="{{ url('student/update') }}">修改</a>

添加页面和修改其实很像,我们可以复制 resources\views\student\create.blade.php,并命名为 resources\views\student\update.blade.php

将“新增学生”修改为“修改学生”。

7.2 创建修改的表单页面

创建控制器的update方法。

/**
 * 用于修改学生信息
 *
 * @param
 * @return    bool
 * @author    webjust [604854119@qq.com]
 */
public function update()
{
    return view('student/update');
}

新增加了一条路由:

Route::get('/', ['uses' => 'StudentController@index']);

// 新增表单路由
Route::any('student/create', ['uses' => 'StudentController@create']);
Route::any('student/update', ['uses' => 'StudentController@update']);

此时,刷新首页,点击修改,应该可以打开修改的表单页面了吧!

但是,我们要修改,首先需要传递一个被修改的用户的 主键id 作为参数吧!

定义一个但参数的路由

Route::any('student/update/{id}', ['uses' => 'StudentController@update']);

此时,我们在修改url()方法,传递第2个参数,使用数组的方式,传递id的值:

<a href="{{ url('student/update', ['id' => $student->id]) }}">修改</a>

在控制器中的update()修改方法中,要接收 id 值;提交时要获取表单的数据吧!所以加入Request依赖组件把!

这个组件很机制的就可以获取传递过来的id值。

如下:

public function update(Request $request, $id)
{
    $student = Student::find($id);
    var_dump($student);

    return view('student/update');
}

我们使用传递过来的id主键,作为参数,使用模型的 find($id) 方法,即可查询数据表中对应的那条数据了!现在我们使用 var_dump 打印,查看结果!

修改学生的信息,把查询出来的数据 $student_info,传递给视图。

public function update(Request $request, $id)
{
    $student_info = Student::find($id);

    return view('student/update', ['student_info' => $student_info]);
}

此时,我们继续做一些操作,把数据填充到视图中。

<form class="form-horizontal" method="post" action="">
    {{ csrf_field() }}
    <div class="form-group">
        <label for="name" class="col-sm-2 control-label">姓名</label>

        <div class="col-sm-5">
            <input type="text" value="{{ old('Student')['name'] ? old('Student')['name'] : $student_info->name }}" name="Student[name]" class="form-control" id="name" placeholder="请输入学生姓名">
        </div>
        <div class="col-sm-5">
            <p class="form-control-static text-danger">{{ $errors->first('Student.name') }}</p>
        </div>
    </div>
    <div class="form-group">
        <label for="age" class="col-sm-2 control-label">年龄</label>

        <div class="col-sm-5">
            <input type="text" value="{{ old('Student')['age'] ? old('Student')['age'] : $student_info->age }}" name="Student[age]" class="form-control" id="age" placeholder="请输入学生年龄">
        </div>
        <div class="col-sm-5">
            <p class="form-control-static text-danger">{{ $errors->first('Student.age') }}</p>
        </div>
    </div>
    <div class="form-group">
        <label class="col-sm-2 control-label">性别</label>
        <div class="col-sm-5">
            @foreach($student->sex() as $ind => $sex)
            <label class="radio-inline">
                <input type="radio"
                name="Student[sex]" {{ ((isset(old('Student')['sex']) && old('Student')['sex'] == $ind) || $student_info->sex == $ind) ? 'checked' : '' }}
                value="{{ $ind }}"> {{ $sex }}
            </label>
            @endforeach
        </div>
        <div class="col-sm-5">
            <p class="form-control-static text-danger">{{ $errors->first('Student.sex') }}</p>
        </div>
    </div>
    <div class="form-group">
        <div class="col-sm-offset-2 col-sm-10">
            <button type="submit" class="btn btn-primary">提交</button>
        </div>
    </div>
</form>

我们采用的是POST提交,提交到当前页 update() 方法中,所以action的值留空。

7.3 使用模型实现修改操作

update() 的方法,和增加的方法差不多,所以可以使用增加的验证方式。

public function update(Request $request, $id)
{
    $student_info = Student::find($id);

    // 修改操作
    if($request->isMethod('POST'))
    {
        // 校验
        $this->validate($request, [
            'Student.name' => 'required|min:2|max:20',
            'Student.age' => 'required|integer',
            'Student.sex' => 'required|integer',
        ],[
            'required' => ':attribute 为必填项',
            'min' => ':attribute 长度不能小于2个字符',
            'max' => ':attribute 长度不能大于20个字符',
            'integer' => ':attribute 必须为数字',
        ],[
            'Student.name' => '用户名',
            'Student.age' => '年龄',
            'Student.sex' => '性别',
        ]);

        $data = $request->input('Student');

        $student_info->name = $data['name'];
        $student_info->age = $data['age'];
        $student_info->sex = $data['sex'];
        $student_info->updated_time = time();

        // 模型的修改方法
        $ret = $student_info->save();
        if($ret)
        {
            return redirect('/')->with('success', '修改成功!')->withInput();
        } else{
            return redirect('student/create')->with('error', '修改失败!')->withInput();
        }
    }

    return view('student/update', ['student_info' => $student_info]);
}

到此,我们的修改功能已经成功了。

如图,左边的hover效果,我们可以继续优化!

把 \resources\views\shared\siderbar.blade.php 文件修改下:

<div class="col-md-3">
    <div class="list-group">
        <a href="{{ url('/') }}"
        class="list-group-item {{ Request::path() != 'student/create' ? 'active' : '' }}">学生列表</a>
        <a href="{{ url('student/create') }}"
        class="list-group-item {{ Request::path() == 'student/create' ? 'active' : '' }}">新增学生</a>
    </div>
</div>

主要就是把条件修改了 Request::path() != '/' ? 'active' : '' 修改为 Request::path() != 'student/create' ? 'active' : ''