本文我將結合簡單例子,完成laravel框架下的增刪改查,但願會對你們有所幫助。
在進行以前,你們應該保證本身的數據庫連接無誤,artisan命令能正常使用,路由連接無問題。php
1、建立控制器、路由
避免影響其餘路由,咱們先註釋掉以前聯繫時編寫的全部路由。
由於上一章咱們已經學會創建了資源控制器,這裏再次複習一下。
1)打開CMD並切換到項目根目錄
2)建立REST風格的控制器css
php artisan make:controller NewsController --resource
3)建立資源路由打開routes/web.php,輸入:html
Route::resource('/','NewsController');
2、展現頁面
當咱們訪問URL 127.0.0.1:9999時,經過資源路由訪問的是NewsController控制器裏的index方法。此刻咱們在控制器裏引入Model類,經過Eloquent ORM方法,往視圖層引入參數。
前端
此時咱們須要建立視圖層,位置在resourcec/views/news/index.blade.php。
具體代碼以下:jquery
<div class="container"> <div class="row"> <div class="col-md-10 col-md-offset-1"> <div class="panel panel-default"> <div class="panel-heading">新聞管理</div> <div class="panel-body"> @if (count($errors) > 0) <div class="alert alert-danger"> {!! implode('<br>', $errors->all()) !!} </div> @endif <a href="{{ url('/create') }}" class="btn btn-lg btn-primary">新增</a> @foreach ($news as $new) <hr> <div class="article"> <h4>{{ $new->title }}</h4> <div class="content"> <p> {{ $new->content }} </p> </div> </div> <a href="{{ url('/'.$new->id.'/edit') }}" class="btn btn-success">編輯</a> <form action="{{ url('/'.$new->id) }}" method="POST" style="display: inline;"> {{ method_field('DELETE') }} {{ csrf_field() }} <button type="submit" class="btn btn-danger">刪除</button> </form> @endforeach </div> </div> </div> </div> </div>
下面咱們訪問頁面:127.0.0.1:9999,查看數據展現狀況以下:
laravel
如上圖,咱們的列表展現已經完成,不過由於時間問題,界面未加前端樣式,你們不要在乎,至此,咱們的展現頁面完成。web
3、增長頁面
由於展現頁面點擊新增後,頁面經過路由跳轉到News控制器的create方法下:create方法以下:
ajax
上圖咱們要注意,在laravel中,視圖url連接能夠用「 / 」分割,也能夠用「 . 」來分割,後者看起來更爲優雅一些。數據庫
<div class="container"> <div class="row"> <div class="col-md-10 col-md-offset-1"> <div class="panel panel-default"> <div class="panel-heading">新增一篇新聞</div> <div class="panel-body"> @if (count($errors) > 0) <div class="alert alert-danger"> <strong>新增失敗</strong> 輸入不符合要求<br><br> {!! implode('<br>', $errors->all()) !!} </div> @endif <form action="{{ url('/') }}" method="POST"> {!! csrf_field() !!} <input type="text" name="title" class="form-control" required="required" placeholder="請輸入標題"> <br> <textarea name="content" rows="10" class="form-control" required="required" placeholder="請輸入內容"></textarea> <br> <button class="btn btn-lg btn-info">新增文章</button> </form> </div> </div> </div> </div> </div>
(上面代碼中的{!! csrf_field() !!} 是爲了防CSRF攻擊的,每一個表單都必須存在。)
web頁面:
bootstrap
根據資源路由,提交該表單後,會經過路由,提交到News控制器的store方法下:
此刻輸入以下代碼:
/** * Store a newly created resource in storage. * * @param \Illuminate\Http\Request $request * @return \Illuminate\Http\Response */ public function store(Request $request) { var_dump($request->all()); }
打印出來傳遞過來的全部變量,以下所示:
咱們能夠看到傳遞過來的參數除了表字段外還有CSRF驗證碼,_token字段,因此若是去掉這個字段,跳轉是不會成功的。
此時咱們能夠經過get 或者post來接收參數並賦值給數組,而後經過Eloquent 方法來入庫,具體操做以下:
/** * Store a newly created resource in storage. * * @param \Illuminate\Http\Request $request * @return \Illuminate\Http\Response */ public function store(Request $request) { // 對提交過來的數據進行數據驗證 $this->validate($request, [ 'title' => 'required|unique:news|max:255', // 必填、在 news 表中惟1、最大長度 255 'content' => 'required', // 必填 ]); // 經過 News Model 插入一條數據進 news 表 $news = new News; // 初始化 Article 對象 $news->title = $request->get('title'); // 將 POST 提交過了的 title 字段的值賦給 news 的 title 屬性 $news->content = $request->get('content'); // 同上 // 將數據保存到數據庫,經過判斷保存結果,控制頁面進行不一樣跳轉 if ($news->save()) { return redirect('/'); // 保存成功,跳轉到 文章管理 頁 } else { // 保存失敗,跳回來路頁面,保留用戶的輸入,並給出提示 return redirect()->back()->withInput()->withErrors('保存失敗!'); } }
此刻咱們能夠看到頁面:
添加失敗,咱們分析緣由能夠得出是由於在進行數據庫save()時,laravel會自動多出兩個字段updated_at和created_at,而咱們的表是手動建的,並無這兩個字段,那如何取消呢?
咱們只須要往模型層加入屬性:
public $timestamps = false;
便可添加完成,併成功跳轉到新聞列表頁面,至此表單的簡單添加完成。
4、刪除頁面
接下來咱們來看一下刪除頁面,相對於添加來講,刪除頁面尤其簡單,咱們是經過展現頁面中的
刪除按鈕來經過表單提交方式進行刪除操做,index.blade.php裏面是這樣寫的。
<form action="{{ url('/'.$new->id) }}" method="POST" style="display: inline;"> {{ method_field('DELETE') }} {{ csrf_field() }} <button type="submit" class="btn btn-danger">刪除</button> </form>
能夠看到表單中的提交方法仍然是POST,而爲了讓資源路由識別,咱們加上了{{ method_field('DELETE') }}這段代碼 ,他的做用等同於
<input type="hidden" name="_method" value="DELETE">
提交後,會把該條數據的ID傳遞到資源控制器的destroy方法內,下面咱們來實現如下:
根據咱們路由裏寫的:
Route::resource('/','NewsController');
此刻咱們會發現,點擊刪除按鈕後竟然報404錯誤,跳轉路徑爲127.0.0.1/{id} ,確認刪除的表單按鈕傳遞參數無誤以後,咱們在cmd中輸入 php artisan route:list,能夠看到下面的資源路由信息:
咱們能夠看到資源路由器的更新和刪除,以及查詢方法的URL路徑是{},既花括號裏是沒有值,這樣子是找不到網頁的,因此咱們須要經過從新命名路由來實現即改成:
Route::resource('comment','NewsController');
這樣咱們再看:
此時URL中的變量是有值的。這裏咱們要注意記得修改index.blade.php 以及 create.blade.php 視圖頁面的跳轉url路徑加上comment。
咱們繼續完成NewsController控制器裏的destroy刪除方法:
/** * Remove the specified resource from storage. * * @param int $id * @return \Illuminate\Http\Response */ public function destroy($id) { News::find($id)->delete(); return redirect()->back()->withInput()->withErrors('刪除成功!'); }
至此,表單的簡單刪除已經完成,若是須要作ajax刪除的時候,只須要把id傳遞到控制器進行刪除,須要重寫方法,此時就須要繼續定義路由。
5、修改頁面
當咱們點擊index.blade.php頁面的修改以後,經過cmd裏的路由資源列表能夠知道,正確路徑應該是經過超連接把id傳遞到控制器的edit方法裏了。
「<a href="{{ url('/'.$new->id.'/edit') }}" class="btn btn-success">編輯</a>」
此時edit方法代碼以下:
/** * Show the form for editing the specified resource. * * @param int $id * @return \Illuminate\Http\Response */ public function edit($id) { // var_dump(News::find($id)->toArray()); return view('news.edit')->withNew(News::find($id)); }
經過Eloquent 對象關係映射獲取到該ID對應的該條信息,傳遞到視圖層中,並展現出來:
edit.blade.php:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1"> <title>Learn Laravel 5</title> <link href="//cdn.bootcss.com/bootstrap/3.2.0/css/bootstrap.min.css" rel="stylesheet"> <script src="//cdn.bootcss.com/jquery/1.11.1/jquery.min.js"></script> <script src="//cdn.bootcss.com/bootstrap/3.2.0/js/bootstrap.min.js"></script> </head> <body> <div id="content" style="padding: 50px;"> <div id="comments" style="margin-top: 50px;"> @if (count($errors) > 0) <div class="alert alert-danger"> <strong>操做失敗</strong> 輸入不符合要求<br><br> {!! implode('<br>', $errors->all()) !!} </div> @endif <div id="new"> <form action="{{ url('comment/'.$new->id) }}" method="POST"> {!! csrf_field() !!} {{--<input type="hidden" name="id" value="{{ $comment->id }}">--}} <input type="hidden" name="_method" value="put"> <div class="form-group"> <label>Title</label> <input type="text" name="title" class="form-control" style="width: 300px;" required="required" value="{{$new->title}}"> </div> <div class="form-group"> <label>Content</label> <textarea name="content" class="form-control" rows="10" required="required">{{$new->content}}</textarea> </div> <button type="submit" class="btn btn-lg btn-success col-lg-12">修改提交</button> </form> </div> <script> function reply(a) { var nickname = a.parentNode.parentNode.firstChild.nextSibling.getAttribute('data'); var textArea = document.getElementById('newFormContent'); textArea.innerHTML = '@'+nickname+' '; } </script> </div> </div> </body> </html>
修改好後表單提交,經過資源路由提交到NewsController控制器的update方法內,而後咱們在update內先打印出$request->all()的值,能夠獲得下面數據:
而後ID也已經傳過來了,咱們經過數據庫修改便可完成修改功能,餘下代碼以下:
/** * Update the specified resource in storage. * * @param \Illuminate\Http\Request $request * @param int $id * @return \Illuminate\Http\Response */ public function update(Request $request, $id) { // var_dump($request->all()); $comment = News::findOrFail($id); $comment->title = $request->get('title'); $comment->content = $request->get('content'); if($comment->save()){ return redirect('comment/'); }else{ return redirect()->back()->withInput()->withErrors('保存信息失敗'); } }
便可完成修改,成功後跳轉到列表頁面。學到這裏咱們不難發現,這個Laravel自帶的Eloquent ORM 是一個優美,穩定,簡潔的ActiveRecord實現。