# 第7節 Laravel-通過表單實現修改 #
7.1 給HTML添加鏈接
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' : ''`