本文我将结合简单例子,完成laravel框架下的增删改查,希望会对大家有所帮助。
在进行之前,大家应该保证自己的数据库链接无误,artisan命令能正常使用,路由链接无问题。
一、创建控制器、路由
避免影响其他路由,我们先注释掉之前联系时编写的所有路由。
因为上一章我们已经学会建立了资源控制器,这里再次复习一下。
1)打开CMD并切换到项目根目录
2)创建REST风格的控制器
php artisan make:controller NewsController --resource
3)创建资源路由打开routes/web.php,输入:
Route::resource('/','NewsController');
二、展示页面
当我们访问URL 127.0.0.1:9999时,通过资源路由访问的是NewsController控制器里的index方法。此刻我们在控制器里引入Model类,通过Eloquent ORM方法,往视图层引入参数。
此时我们需要创建视图层,位置在resourcec/views/news/index.blade.php。
具体代码如下:
<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,查看数据展示情况如下:
如上图,我们的列表展示已经完成,不过因为时间问题,界面未加前端样式,大家不要在意,至此,我们的展示页面完成。
三、增加页面
因为展示页面点击新增后,页面通过路由跳转到News控制器的create方法下:create方法如下:
上图我们要注意,在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页面:
根据资源路由,提交该表单后,会通过路由,提交到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 表中唯一、最大长度 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;
即可添加完成,并成功跳转到新闻列表页面,至此表单的简单添加完成。
四、删除页面
接下来我们来看一下删除页面,相对于添加来说,删除页面尤为简单,我们是通过展示页面中的
删除按钮来通过表单提交方式进行删除操作,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传递到控制器进行删除,需要重写方法,此时就需要继续定义路由。
五、修改页面
当我们点击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实现。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。