后盾网lavarel视频项目---lavarel多表关联一对多操作实例

一、总结

一句话总结:

1、一对多中多那个部分的数据前端通过json弄到服务器
2、所有通过一操作多的时候,都要用上模型中定义的那个方法:$lesson->videos()->create($video);

1、页面直接通过一对多中的一找到多的数量?

控制器中:$data=Lesson::get();
视图中:{{$d->videos()->count()}}
控制器中
public function index()
{$data=Lesson::get();//dd($data->toArray());return view('admin.lesson.index',compact('data'));
}视图中
<tr>
<td>{{$d['id']}}.</td>
<td>{{$d['title']}}</td>
<td>{{$d->videos()->count()}}</td>

2、一对多模型中多对应部分数据通过json传到服务器?

1、转成数组:$videos=json_decode($request['videos'],true);
2、所有通过一操作多的时候,都要用上模型中定义的那个方法:$lesson->videos()->create($video);
  //videos数据过来的时候是json数据,true表示转成数组而非对象$videos=json_decode($request['videos'],true);foreach ($videos as $video){$lesson->videos()->create($video);}

二、lavarel多表关联一对多操作实例

1、模型

app/Model/Lesson.php

 1 <?php
 2
 3 namespace App\Model;
 4
 5 use Illuminate\Database\Eloquent\Model;
 6
 7 class Lesson extends Model
 8 {
 9     /**
10      * 与视频表模型的一对多关联
11      * @return \Illuminate\Database\Eloquent\Relations\HasMany
12      */
13     public function videos(){
14         return $this->hasMany(Video::class);
15     }
16 }

app/Model/Video.php

 1 <?php
 2
 3 namespace App\Model;
 4
 5 use Illuminate\Database\Eloquent\Model;
 6
 7 class Video extends Model
 8 {
 9     protected $guarded=[];
10 }

2、控制器

app/Http/Controllers/Admin/LessonController.php

  1 <?php
  2
  3 namespace App\Http\Controllers\Admin;
  4
  5 use App\Model\Lesson;
  6 use Illuminate\Http\Request;
  7 use App\Http\Controllers\Controller;
  8
  9 class LessonController extends CommonController
 10 {
 11     /**
 12      * Display a listing of the resource.
 13      *
 14      * @return \Illuminate\Http\Response
 15      */
 16     public function index()
 17     {
 18         $data=Lesson::get();
 19         //dd($data->toArray());
 20         return view('admin.lesson.index',compact('data'));
 21     }
 22
 23     /**
 24      * Show the form for creating a new resource.
 25      *
 26      * @return \Illuminate\Http\Response
 27      */
 28     public function create()
 29     {
 30 //        $d=Lesson::find(1)->videos()->get();
 31 //        dd($d->toArray());
 32         return view('admin.lesson.create');
 33     }
 34
 35     /**
 36      * Store a newly created resource in storage.
 37      *
 38      * @param  \Illuminate\Http\Request  $request
 39      * @return \Illuminate\Http\Response
 40      */
 41     public function store(Request $request,Lesson $lesson)
 42     {
 43         //dd($request->toArray());
 44         $lesson['title']=$request['title'];
 45         $lesson['introduce']=$request['introduce'];
 46         $lesson['preview']=$request['preview'];
 47         $lesson['is_commend']=$request['is_commend'];
 48         $lesson['is_hot']=$request['is_hot'];
 49         $lesson['click']=$request['click'];
 50         $lesson->save();
 51
 52         //videos数据过来的时候是json数据,true表示转成数组而非对象
 53         $videos=json_decode($request['videos'],true);
 54         foreach ($videos as $video){
 55             $lesson->videos()->create($video);
 56         }
 57         return redirect('/admin/lesson');
 58
 59
 60     }
 61
 62     /**
 63      * Display the specified resource.
 64      *
 65      * @param  int  $id
 66      * @return \Illuminate\Http\Response
 67      */
 68     public function show($id)
 69     {
 70         //
 71     }
 72
 73     /**
 74      * Show the form for editing the specified resource.
 75      *
 76      * @param  int  $id
 77      * @return \Illuminate\Http\Response
 78      */
 79     public function edit($id)
 80     {
 81         //
 82     }
 83
 84     /**
 85      * Update the specified resource in storage.
 86      *
 87      * @param  \Illuminate\Http\Request  $request
 88      * @param  int  $id
 89      * @return \Illuminate\Http\Response
 90      */
 91     public function update(Request $request, $id)
 92     {
 93         //
 94     }
 95
 96     /**
 97      * Remove the specified resource from storage.
 98      *
 99      * @param  int  $id
100      * @return \Illuminate\Http\Response
101      */
102     public function destroy($id)
103     {
104         //
105     }
106 }

44-50行:增加课程数据

53-56行:增加视频数据

第55行:所有通过一操作多的时候,都要用上模型中定义的那个方法:$lesson->videos()->create($video);

3、视图

resources/views/admin/lesson/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/lesson" type="button" class="btn btn-default">课程列表</a>
 21                 <a href="/admin/lesson/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/lesson" method="post">
 32                 {{csrf_field()}}
 33                 <div class="box-body">
 34                     <div class="form-group">
 35                         <label for="title" class="col-sm-2 control-label">课程标题</label>
 36
 37                         <div class="col-sm-10">
 38                             <input type="text" name="title" class="form-control" id="title" required placeholder="标题">
 39                         </div>
 40                     </div>
 41                     <div class="form-group">
 42                         <label for="introduce" class="col-sm-2 control-label">介绍</label>
 43                         <div class="col-sm-10">
 44                             <textarea name="introduce"  class="form-control" id="introduce" rows="5" required></textarea>
 45                         </div>
 46                     </div>
 47                     <div class="form-group">
 48                         <label for="preview" class="col-sm-2 control-label">预览图</label>
 49                         <div class="col-sm-10">
 50                             <div class="input-group">
 51                                 <input type="text" class="form-control" name="preview" readonly=""
 52                                        value="images/nopic.jpg" required>
 53                                 <div class="input-group-btn">
 54                                     <button onclick="upImage(this)" class="btn btn-default"
 55                                             type="button">选择图片
 56                                     </button>
 57                                 </div>
 58                             </div>
 59                             <div class="input-group" style="margin-top:5px;">
 60                                 <img src="{{asset('images/nopic.jpg')}}"
 61                                      class="img-responsive img-thumbnail" width="150">
 62                                 <em class="close" style="position:absolute; top: 0px; right: -14px;"
 63                                     title="删除这张图片" onclick="removeImg(this)">×</em>
 64                             </div>
 65                         </div>
 66                         <script>
 67                             //上传图片
 68                             function upImage(obj) {
 69                                 require(['util'], function (util) {
 70                                     options = {
 71                                         multiple: false,//是否允许多图上传
 72                                     };
 73                                     util.image(function (images) {          //上传成功的图片,数组类型
 74                                         $("[name='preview']").val(images[0]);
 75                                         $(".img-thumbnail").attr('src', images[0]);
 76                                     }, options)
 77                                 });
 78                             }
 79
 80                             //移除图片
 81                             function removeImg(obj) {
 82                                 $(obj).prev('img').attr('src', 'resource/images/nopic.jpg');
 83                                 $(obj).parent().prev().find('input').val('');
 84                             }
 85                         </script>
 86                     </div>
 87                     <div class="form-group">
 88                         <label for="is_commend" class="col-sm-2 control-label">推荐</label>
 89                         <div class="col-sm-10">
 90                             <label class="radio-inline">
 91                                 <input type="radio" name="is_commend" id="is_commend1" value="1"> 是
 92                             </label>
 93                             <label class="radio-inline">
 94                                 <input type="radio" name="is_commend" id="is_commend0" value="0" checked> 否
 95                             </label>
 96                         </div>
 97                     </div>
 98                     <div class="form-group">
 99                         <label for="is_hot" class="col-sm-2 control-label">热门</label>
100                         <div class="col-sm-10">
101                             <label class="radio-inline">
102                                 <input type="radio" name="is_hot" id="is_hot1" value="1"> 是
103                             </label>
104                             <label class="radio-inline">
105                                 <input type="radio" name="is_hot" id="is_hot0" value="0" checked> 否
106                             </label>
107                         </div>
108                     </div>
109                     <div class="form-group">
110                         <label for="click" class="col-sm-2 control-label">点击数</label>
111
112                         <div class="col-sm-10">
113                             <input type="number" name="click" class="form-control" id="click" placeholder="点击数" value="0">
114                         </div>
115                     </div>
116
117                     {{--视频管理--}}
118                     <div class="panel panel-info" id="app">
119                         <div class="panel-heading">视频管理</div>
120                         <div class="panel-body">
121                             {{--子元素--}}
122                             <div class="panel panel-default" v-for="(v,k) in videos">
123                                 <div class="panel-body">
124                                     <div class="form-group">
125                                         <label for="v_title" class="col-sm-2 control-label">视频标题</label>
126
127                                         <div class="col-sm-10">
128                                             <input type="text" name="v_title" class="form-control" v-model="v.title">
129                                         </div>
130                                     </div>
131                                     <div class="form-group">
132                                         <label for="v_path" class="col-sm-2 control-label">视频地址</label>
133                                         <div class="col-sm-10">
134                                             <input type="text" name="v_path" class="form-control" v-model="v.path">
135                                         </div>
136                                     </div>
137                                 </div>
138                                 <div class="panel-footer">
139                                     <button class="btn btn-success btn-sm" @click.prevent="del(k)">删除视频</button>
140                                 </div>
141                             </div>
142                             {{--END-子元素--}}
143                             <div class="form-group">
144                                 <textarea name="videos" cols="30" rows="10">@{{videos}}</textarea>
145                             </div>
146                         </div>
147                         <div class="panel-footer">
148                             <button class="btn btn-primary btn-sm" @click.prevent="add">添加视频</button>
149                         </div>
150
151
152                     </div>
153
154                 </div>
155                 <!-- /.box-body -->
156
157                 <div class="box-footer">
158                     <button type="submit" class="btn btn-info">保存数据</button>
159                 </div>
160                 <!-- /.box-footer -->
161             </form>
162         </div>
163
164         <script>
165             require(['vue'],function (Vue) {
166                 new Vue({
167                     el:'#app',
168                     data:{
169                         videos:[{title:'',path:''}]
170                     },
171                     methods:{
172                         add:function () {
173                             this.videos.push({title:'',path:''});
174                         },
175                         del:function (k) {
176                             this.videos.splice(k,1);
177                         }
178                     }
179                 });
180             });
181         </script>
182
183     </section>
184     <!-- /.content -->
185 @endsection

第144行:一对多中多的那部分的数据是通过json到服务器的,然后添加到数据库

resources/views/admin/lesson/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/lesson" type="button" class="btn btn-warning">课程列表</a>
21                 <a href="/admin/lesson/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="width: 10px">#</th>
36                             <th>课程</th>
37                             <th>视频数量</th>
38                             <th>操作</th>
39                         </tr>
40                         @foreach($data as $d)
41                             <tr>
42                                 <td>{{$d['id']}}.</td>
43                                 <td>{{$d['title']}}</td>
44                                 <td>{{$d->videos()->count()}}</td>
45                                 <td>
46                                     <div class="btn-group">
47                                         <button type="button" class="btn btn-info">操作</button>
48                                         <button type="button" class="btn btn-info dropdown-toggle" data-toggle="dropdown">
49                                             <span class="caret"></span>
50                                             <span class="sr-only">Toggle Dropdown</span>
51                                         </button>
52                                         <ul class="dropdown-menu" role="menu" style="">
53                                             <li><a href="/admin/lesson/{{$d['id']}}/edit">编辑</a></li>
54                                             <li><a href="javascript:;" onclick="del({{$d['id']}})">删除</a></li>
55                                         </ul>
56                                     </div>
57                                 </td>
58                             </tr>
59                         @endforeach
60
61                         </tbody>
62                     </table>
63                 </div>
64
65             </div>
66             <!-- /.box-body -->
67             <div class="box-footer clearfix">
68                 <ul class="pagination pagination-sm no-margin pull-right">
69                     <li><a href="#">«</a></li>
70                     <li><a href="#">1</a></li>
71                     <li><a href="#">2</a></li>
72                     <li><a href="#">3</a></li>
73                     <li><a href="#">»</a></li>
74                 </ul>
75             </div>
76         </div>
77
78     </section>
79     <!-- /.content -->
80     <script>
81         function del(id){
82             // require(['util'],function () {83             //     util.confirm('确定删除么?',function () {84             //
85             //     });
86             // });
87             if(confirm('确定删除么')){
88                 $.ajax({
89                     url:'/admin/lesson/'+id,
90                     method:'DELETE',
91                     success:function (response) {
92                         location.reload();
93                     }
94                 });
95             }
96         }
97     </script>
98 @endsection

第44行:直接 {{$d->videos()->count()}}就可以得到课程视频数,毕竟$data获取的只是Lesson模型的数据:$data=Lesson::get();

转载于:https://www.cnblogs.com/Renyi-Fan/p/11546792.html

后盾网lavarel视频项目---lavarel多表关联一对多操作实例相关推荐

  1. 后盾网lavarel视频项目---lavarel中的tinker是什么

    后盾网lavarel视频项目---lavarel中的tinker是什么 一.总结 一句话总结: 是用来调试laravel,可以打印变量或对象信息,显示函数代码,对数据库写入和查询数据 laravel中 ...

  2. 后盾网lavarel视频项目---lavarel用户认证实例

    后盾网lavarel视频项目---lavarel用户认证实例 一.总结 一句话总结: 主要是用的Auth认证,所以配置是配置的auth(config/auth.php),控制器中调用也是用的Auth( ...

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

    后盾网lavarel视频项目---lavarel使用模型进行增删改查操作 一.总结 一句话总结: 使用模型操作常用方法 查一条:$model=Tag::find($id); 删一条:Tag::dest ...

  4. 后盾网lavarel视频项目---lavarel中间件(使用中间件拦截没登录的用户)

    后盾网lavarel视频项目---lavarel中间件(使用中间件拦截没登录的用户) 一.总结 一句话总结: 1.中间件中验证用户是否登录:if(!Auth::guard('admin')->c ...

  5. 后盾网lavarel视频项目---4、lavarel和vue都是{{}}表示变量,如何解决冲突

    后盾网lavarel视频项目---4.lavarel和vue都是{{}}表示变量,如何解决冲突 一.总结 一句话总结: @{{videos}}:@符号表示lavarel不处理:textarea nam ...

  6. 后盾网lavarel视频项目---模型一对多关联简单实例

    后盾网lavarel视频项目---模型一对多关联简单实例 一.总结 一句话总结: 在模型中定义一个方法来设置一对多关联:return $this->hasMany(Video::class); ...

  7. 后盾网lavarel视频项目---3、lavarel中子控制器继承父控制器以判断是否登录

    后盾网lavarel视频项目---3.lavarel中子控制器继承父控制器以判断是否登录 一.总结 一句话总结: 在common控制器的构造方法中验证登录中间件,其它的控制器继承common控制器 p ...

  8. 后盾网lavarel视频项目---自定义验证和自定义验证规则

    后盾网lavarel视频项目---自定义验证和自定义验证规则 一.总结 一句话总结: 1.自定义验证就是用的自定义验证请求类:php artisan make:request AdminPost 2. ...

  9. 后盾网lavarel视频项目---2、phpstorm显示类中的方法快捷键

    后盾网lavarel视频项目---2.phpstorm显示类中的方法快捷键 一.总结 一句话总结: ctrl + f12 1.npm安装js插件? npm install hdjs 2.phpstor ...

最新文章

  1. CoAP 协议解析说明(转)
  2. 编译安装日志分析平台 elk + beats(个人感觉不错1)
  3. hill密码源代码c语言,古典密码(Hill加密算法)(示例代码)
  4. Educational Codeforces Round 24 E. Card Game Again(双指针)
  5. [BuildRelease]Mozilla Build Tools(自动设置VC环境)
  6. pajek的net文件格式
  7. 批量修改横断面图高程范围
  8. 计算机网络——数字信号(五)
  9. 问题驱动,提出问题,发现问题,解决问题
  10. waitting for debuger
  11. Dynamic , Static or Seperate Schema Design (Convert No-SQL to ORDBMS)
  12. Python----列表
  13. GK110和GK104
  14. HTML5编写的小游戏
  15. ​【原创】基于SSM的校园二手物品交易商城(毕业设计源代码)
  16. 【内核配置】六、修改内核自带的的LCD驱动源码并编译进内核 | 烧写到Mini2440__TD35 完整攻略...
  17. wlan和wfi的区别
  18. PHP爬虫之解析页面的方法
  19. Linux会帮你打剩下的字符,当您在命令提示符的后面输入命令的一部分时,按(__),Linux会帮你打剩下的字符,补充成为完整命令...
  20. python实现五环

热门文章

  1. vuex实践之路——笔记本应用(三)
  2. java-------------华为-----------字符串链接最长路径查询
  3. 发现个很有意思的angularjs +grunt 复习项目
  4. 清楚xcode缓存(老是忘记所有记下来方便以后查阅)
  5. SQL Server性能计数器部署(批量)
  6. Python自然语言处理学习笔记(66):7.7 小结
  7. 利用SOS分析调试托管代码--(1)
  8. JavaScript 学习(2) - JS的内建对象
  9. 从头开始安装Ubuntu,cuda,cudnn,caffe,tensorflow,ROS
  10. Python 学习笔记 -- 继承与多态(入门级实例)