本文我将结合简单例子,完成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实现。