后盾网lavarel视频项目---lavarel使用模型进行增删改查操作

后盾网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 表单不能生成 PUTPATCH 和 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来验证的

 
原文地址:https://www.cnblogs.com/Renyi-Fan/p/11531274.html