后盾网lavarel视频项目---lavarel使用模型进行增删改查操作
一、总结
一句话总结:
使用模型操作常用方法
查一条:$model=Tag::find($id);
删一条:Tag::destroy($id);
查全部:$data=Tag::get();
增加:$model->create($request->all());
1、资源路由器操作处理的动作、URL、行为、路由名称?
看手册喽,修改和增加用的是两个,一个是get显示界面,一个是处理逻辑
动作 | URI | 行为 | 路由名称 |
---|---|---|---|
GET | /photos |
index | photos.index |
GET | /photos/create |
create | photos.create |
POST | /photos |
store | photos.store |
GET | /photos/{photo} |
show | photos.show |
GET | /photos/{photo}/edit |
edit | photos.edit |
PUT/PATCH | /photos/{photo} |
update | photos.update |
DELETE | /photos/{photo} |
destroy | photos.destroy |
2、更新操作中,需要表单传递PUT请求,如何做?
伪造表单方法:@method('PUT')
<form action="/foo/bar" method="POST"> @method('PUT') </form>
3、解决剔除token字段存数据库的问题?
模型中定义$guarded为空数组:protected $guarded=[];
4、jquery自动传递csrf的token字段?
在页头创建csrf-token的meta标签,在页尾用ajaxSetup设置token的值
X-CSRF-TOKEN
除了检查 POST 参数中的 CSRF 令牌外, VerifyCsrfToken 中间件还会检查 X-CSRF-TOKEN 请求头。你应该将令牌保存在 HTML meta 标签中,如下:
<meta name="csrf-token" content="{{ csrf_token() }}">
然后,一旦你创建了 meta 标签,就可以指示像 jQuery 这样的库自动将令牌添加到所有请求的头信息中。还可以为基于 AJAX 的应用提供简单、方便的 CSRF 保护。如下:
$.ajaxSetup({
headers: {
'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
}
});
{tip} 默认情况下,resources/assets/js/bootstrap.js 文件会用 Axios HTTP 函数库注册 csrf-token meta 标签中的值。如果不使用这个函数库,则需要为你的应用手动配置此行为。
二、lavarel使用模型进行增删改查操作
1、相关知识
资源控制器操作处理
动作 | URI | 行为 | 路由名称 |
---|---|---|---|
GET | /photos |
index | photos.index |
GET | /photos/create |
create | photos.create |
POST | /photos |
store | photos.store |
GET | /photos/{photo} |
show | photos.show |
GET | /photos/{photo}/edit |
edit | photos.edit |
PUT/PATCH | /photos/{photo} |
update | photos.update |
DELETE | /photos/{photo} |
destroy | photos.destroy |
指定资源模型
如果你使用了路由模型绑定,并且想在资源控制器的方法中使用类型提示,你可以在生成控制器的时候使用 --model
选项:
php artisan make:controller PhotoController --resource --model=Photo
伪造表单方法
因为 HTML 表单不能生成 PUT
,PATCH
和 DELETE
请求,所以你需要添加一个隐藏的 _method
字段来伪造这些 HTTP 动作。 这个 Blade 指令 @method 可以为你创建这个字段:
<form action="/foo/bar" method="POST">
@method('PUT')
</form>
2、代码
表
一、控制器
app/Http/Controllers/Admin/TagController.php
1 <?php 2 3 namespace AppHttpControllersAdmin; 4 5 use AppHttpRequestsTagRequest; 6 use AppModelTag; 7 use IlluminateHttpRequest; 8 use AppHttpControllersController; 9 10 class TagController extends CommonController 11 { 12 13 /** 14 * Display a listing of the resource. 15 * 16 * @return IlluminateHttpResponse 17 */ 18 public function index() 19 { 20 // 21 session(['nowControllerAction'=>AppModelControllerAndFunction::jointControllerAndFunction()]); 22 $data=Tag::get(); 23 return view('admin.tag.index',compact('data')); 24 } 25 26 /** 27 * Show the form for creating a new resource. 28 * 29 * @return IlluminateHttpResponse 30 */ 31 public function create() 32 { 33 return view('admin.tag.create'); 34 } 35 36 /** 37 * 保存新增的数据 38 * Store a newly created resource in storage. 39 * 40 * @param IlluminateHttpRequest $request 41 * @return IlluminateHttpResponse 42 */ 43 public function store(TagRequest $request,Tag $model) 44 { 45 $model->create($request->all()); 46 return redirect('/admin/tag'); 47 //dd($request); 48 } 49 50 /** 51 * Display the specified resource. 52 * 53 * @param int $id 54 * @return IlluminateHttpResponse 55 */ 56 public function show($id) 57 { 58 // 59 } 60 61 /** 62 * Show the form for editing the specified resource. 63 * 64 * @param int $id 65 * @return IlluminateHttpResponse 66 */ 67 public function edit($id) 68 { 69 $model=Tag::find($id); 70 return view('admin.tag.edit',compact('model')); 71 } 72 73 /** 74 * Update the specified resource in storage. 75 * 76 * @param IlluminateHttpRequest $request 77 * @param int $id 78 * @return IlluminateHttpResponse 79 */ 80 public function update(TagRequest $request, $id) 81 { 82 $model=Tag::find($id); 83 $model['name']=$request['name']; 84 $model->save(); 85 return redirect('/admin/tag'); 86 } 87 88 /** 89 * Remove the specified resource from storage. 90 * 91 * @param int $id 92 * @return IlluminateHttpResponse 93 */ 94 public function destroy($id) 95 { 96 Tag::destroy($id); 97 return response()->json(['message'=>'刪除成功','valid'=>1]); 98 } 99 }
第43行和第80行,都用TagRequest进行了验证
二、模型
app/Model/Tag.php
1 <?php 2 3 namespace AppModel; 4 5 use IlluminateDatabaseEloquentModel; 6 7 class Tag extends Model 8 { 9 //$guarded表示不允许批量填充的字段 10 protected $guarded=[]; 11 }
第10行,定义这个$guarded字段解决了剔除token字段存数据库的问题
Tag模型对应数据库tag表,控制器中就是用Tag进行数据库操作
三、请求
app/Http/Requests/TagRequest.php
1 <?php 2 3 namespace AppHttpRequests; 4 5 use IlluminateFoundationHttpFormRequest; 6 7 class TagRequest extends FormRequest 8 { 9 /** 10 * Determine if the user is authorized to make this request. 11 * 12 * @return bool 13 */ 14 public function authorize() 15 { 16 return true; 17 } 18 19 /** 20 * Get the validation rules that apply to the request. 21 * 22 * @return array 23 */ 24 public function rules() 25 { 26 return [ 27 'name'=>'sometimes|required', 28 ]; 29 } 30 31 /** 32 * 中文提示 33 * @return array 34 */ 35 public function messages() 36 { 37 return [ 38 'name.required'=>'标签名称不能为空', 39 ]; 40 } 41 }
四、视图
resources/views/admin/tag/create.blade.php
1 @extends('admin.layout.master') 2 @section('title','新增标签') 3 @section('content') 4 <!-- Content Header (Page header) --> 5 <section class="content-header"> 6 <h1> 7 Dashboard 8 <small>Control panel</small> 9 </h1> 10 <ol class="breadcrumb"> 11 <li><a href="#"><i class="fa fa-dashboard"></i> Home</a></li> 12 <li class="active">Dashboard</li> 13 </ol> 14 </section> 15 16 <!-- Main content --> 17 <section class="content"> 18 <div style="padding-bottom:15px;"> 19 <div class="btn-group" role="group" aria-label="..."> 20 <a href="/admin/tag" type="button" class="btn btn-default">标签列表</a> 21 <a href="/admin/tag/create" type="button" class="btn btn-warning">新增标签</a> 22 </div> 23 </div> 24 25 <div class="box box-info"> 26 <div class="box-header with-border"> 27 <h3 class="box-title">Horizontal Form</h3> 28 </div> 29 <!-- /.box-header --> 30 <!-- form start --> 31 <form class="form-horizontal" action="/admin/tag" method="post"> 32 {{csrf_field()}} 33 <div class="box-body"> 34 <div class="form-group"> 35 <label for="name" class="col-sm-2 control-label">标签</label> 36 37 <div class="col-sm-10"> 38 <input type="text" name="name" class="form-control" id="name" required placeholder="标签"> 39 </div> 40 </div> 41 42 </div> 43 <!-- /.box-body --> 44 <div class="box-footer"> 45 <button type="submit" class="btn btn-info">保存数据</button> 46 </div> 47 <!-- /.box-footer --> 48 </form> 49 </div> 50 51 </section> 52 <!-- /.content --> 53 @endsection
resources/views/admin/tag/edit.blade.php
1 @extends('admin.layout.master') 2 @section('title','修改标签') 3 @section('content') 4 <!-- Content Header (Page header) --> 5 <section class="content-header"> 6 <h1> 7 Dashboard 8 <small>Control panel</small> 9 </h1> 10 <ol class="breadcrumb"> 11 <li><a href="#"><i class="fa fa-dashboard"></i> Home</a></li> 12 <li class="active">Dashboard</li> 13 </ol> 14 </section> 15 16 <!-- Main content --> 17 <section class="content"> 18 <div style="padding-bottom:15px;"> 19 <div class="btn-group" role="group" aria-label="..."> 20 <a href="/admin/tag" type="button" class="btn btn-default">标签列表</a> 21 <a href="/admin/tag/create" type="button" class="btn btn-warning">修改标签</a> 22 </div> 23 </div> 24 25 <div class="box box-info"> 26 <div class="box-header with-border"> 27 <h3 class="box-title">Horizontal Form</h3> 28 </div> 29 <!-- /.box-header --> 30 <!-- form start --> 31 <form class="form-horizontal" action="/admin/tag/{{$model['id']}}" method="post"> 32 {{csrf_field()}} 33 @method('PUT') 34 <div class="box-body"> 35 <div class="form-group"> 36 <label for="name" class="col-sm-2 control-label">标签</label> 37 38 <div class="col-sm-10"> 39 <input type="text" name="name" class="form-control" id="name" required placeholder="标签" value="{{$model['name']}}"> 40 </div> 41 </div> 42 43 </div> 44 <!-- /.box-body --> 45 <div class="box-footer"> 46 <button type="submit" class="btn btn-info">保存数据</button> 47 </div> 48 <!-- /.box-footer --> 49 </form> 50 </div> 51 52 </section> 53 <!-- /.content --> 54 @endsection
第33行,请求伪造
resources/views/admin/tag/index.blade.php
1 @extends('admin.layout.master') 2 @section('title','标签页面') 3 @section('content') 4 <!-- Content Header (Page header) --> 5 <section class="content-header"> 6 <h1> 7 Dashboard 8 <small>Control panel</small> 9 </h1> 10 <ol class="breadcrumb"> 11 <li><a href="#"><i class="fa fa-dashboard"></i> Home</a></li> 12 <li class="active">Dashboard</li> 13 </ol> 14 </section> 15 16 <!-- Main content --> 17 <section class="content"> 18 <div style="padding-bottom:15px;"> 19 <div class="btn-group" role="group" aria-label="..."> 20 <a href="/admin/tag" type="button" class="btn btn-warning">标签列表</a> 21 <a href="/admin/tag/create" type="button" class="btn btn-default">新增标签</a> 22 </div> 23 </div> 24 25 <div class="box box-primary"> 26 <div class="box-header with-border"> 27 <h3 class="box-title">Bordered Table</h3> 28 </div> 29 <!-- /.box-header --> 30 <div class="box-body"> 31 <div class="table-responsive" style="overflow: visible;min-height: 200px;"> 32 <table class="table table-hover"> 33 <tbody> 34 <tr class="info"> 35 <th style=" 10px">#</th> 36 <th>标签</th> 37 <th>操作</th> 38 </tr> 39 @foreach($data as $d) 40 <tr> 41 <td>{{$d['id']}}.</td> 42 <td>{{$d['name']}}</td> 43 <td> 44 <div class="btn-group"> 45 <button type="button" class="btn btn-info">操作</button> 46 <button type="button" class="btn btn-info dropdown-toggle" data-toggle="dropdown"> 47 <span class="caret"></span> 48 <span class="sr-only">Toggle Dropdown</span> 49 </button> 50 <ul class="dropdown-menu" role="menu" style=""> 51 <li><a href="/admin/tag/{{$d['id']}}/edit">编辑</a></li> 52 <li><a href="javascript:;" onclick="del({{$d['id']}})">删除</a></li> 53 </ul> 54 </div> 55 </td> 56 </tr> 57 @endforeach 58 59 </tbody> 60 </table> 61 </div> 62 63 </div> 64 <!-- /.box-body --> 65 <div class="box-footer clearfix"> 66 <ul class="pagination pagination-sm no-margin pull-right"> 67 <li><a href="#">«</a></li> 68 <li><a href="#">1</a></li> 69 <li><a href="#">2</a></li> 70 <li><a href="#">3</a></li> 71 <li><a href="#">»</a></li> 72 </ul> 73 </div> 74 </div> 75 76 </section> 77 <!-- /.content --> 78 <script> 79 function del(id){ 80 // require(['util'],function () { 81 // util.confirm('确定删除么?',function () { 82 // 83 // }); 84 // }); 85 if(confirm('确定删除么')){ 86 $.ajax({ 87 url:'/admin/tag/'+id, 88 method:'DELETE', 89 success:function (response) { 90 location.reload(); 91 } 92 }); 93 } 94 } 95 </script> 96 @endsection
这里的ajax没有传token字段是因为 模板主页里面进行了jquery的token验证,调用jquery会自动传token来验证的