legend3---lavarel多对多模型操做实例
1、总结
一句话总结:
在多对多模型中,增长关系表的数据 须要 弄一个和关系表一对多的模型关系
一、在lavarel关系模型中,课程和标签表是多对多,那么我如何增长课程标签联合表的数据?
定义一个一对多的模型,由于课程和标签表是多对多,那么课程和课程标签联合表是一对多
//与课程标签联合表的一对多关系 public function hasManyLessonTags(){ return $this->hasMany(\App\Model\Admin\TagAndLesson::class,'tl_l_id','l_id'); }
//二、插入标签课程数据--关系表 $tags=$request['tags']; foreach ($tags as $tag){ $tag_lesson=[]; $tag_lesson['tl_t_id']=$tag; //$tag_lesson['tl_l_id']=$lesson['l_id']; //TagAndLesson::create($tag_lesson); //dd($tag_lesson); $lesson->hasManyLessonTags()->create($tag_lesson); }
二、在lavarel关系模型中,定义模型关系的第一个参数是什么意思:例如$this->hasMany(Video::class,'v_l_id','l_id');?
关联的模型,也就是【最终要获取数据的表模型】,这里是哪一个模型就表示要操做哪一个表
三、在lavarel关系模型中,课程和标签表是多对多,我在定义好了多对多的模型关系,我可否用这个模型关系增长课程标签联合表的数据?
不能,由于模型关系的第一个参数是最终要操做数据的表模型
2、lavarel多对多模型操做实例
一、关系和数据表结构
课程和标签表是多对多php
课程表:lessonsjson
CREATE TABLE `lessons` ( `l_id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT, `l_title` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, `l_introduce` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, `l_preview` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, `l_is_commend` tinyint(4) NOT NULL, `l_is_hot` tinyint(4) NOT NULL, `l_click` int(11) NOT NULL DEFAULT 0 COMMENT '点击数/浏览数', `l_like` int(11) NOT NULL DEFAULT 0 COMMENT '点赞数', `l_comment_num` int(11) NOT NULL DEFAULT 0 COMMENT '评论数', `created_at` timestamp(0) NULL DEFAULT NULL, `updated_at` timestamp(0) NULL DEFAULT NULL, PRIMARY KEY (`l_id`) USING BTREE ) ENGINE = InnoDB AUTO_INCREMENT = 27 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;
标签表:tags数组
CREATE TABLE `tags` ( `t_id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT, `t_name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, `created_at` timestamp(0) NULL DEFAULT NULL, `updated_at` timestamp(0) NULL DEFAULT NULL, PRIMARY KEY (`t_id`) USING BTREE ) ENGINE = InnoDB AUTO_INCREMENT = 4 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;
课程标签表:tag_and_lessonsapp
CREATE TABLE `tag_and_lessons` ( `tl_id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT, `tl_t_id` int(11) NOT NULL COMMENT '标签id', `tl_l_id` int(11) NOT NULL COMMENT '课程id', `created_at` timestamp(0) NULL DEFAULT NULL, `updated_at` timestamp(0) NULL DEFAULT NULL, PRIMARY KEY (`tl_id`) USING BTREE, INDEX `tag_and_lessons_tl_t_id_index`(`tl_t_id`) USING BTREE, INDEX `tag_and_lessons_tl_l_id_index`(`tl_l_id`) USING BTREE ) ENGINE = InnoDB AUTO_INCREMENT = 15 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;
二、模型代码
app/Model/Lesson.phpless
1 <?php 2 3 namespace App\Model; 4 5 use Illuminate\Database\Eloquent\Model; 6 7 class Lesson extends Model 8 { 9 protected $primaryKey='l_id'; 10 /** 11 * 与视频表模型的一对多关联 12 * @return \Illuminate\Database\Eloquent\Relations\HasMany 13 */ 14 public function videos(){ 15 return $this->hasMany(Video::class,'v_l_id','l_id'); 16 } 17 18 //与标签的多对多关系 19 public function hasManyTags(){ 20 return $this->belongsToMany('App\Model\Tag','tag_and_lessons','tl_l_id','tl_t_id'); 21 } 22 23 //与课程标签联合表的一对多关系 24 public function hasManyLessonTags(){ 25 return $this->hasMany(\App\Model\Admin\TagAndLesson::class,'tl_l_id','l_id'); 26 } 27 }
app/Model/Tag.phpide
<?php namespace App\Model; use Illuminate\Database\Eloquent\Model; class Tag extends Model { //$guarded表示不容许批量填充的字段 protected $primaryKey='t_id'; protected $guarded=[]; }
app/Model/Admin/TagAndLesson.phpthis
<?php namespace App\Model\Admin; use Illuminate\Database\Eloquent\Model; class TagAndLesson extends Model { // protected $primaryKey='tl_id'; protected $guarded=[]; }
三、控制器中使用的代码
app/Http/Controllers/Admin/LessonController.phpspa
1 public function store(Request $request,Lesson $lesson) 2 { 3 DB::transaction(function () use ($request,$lesson) { 4 //dd($request->toArray()); 5 $lesson['l_title']=$request['l_title']; 6 $lesson['l_introduce']=$request['l_introduce']; 7 $lesson['l_preview']=$request['l_preview']; 8 $lesson['l_is_commend']=$request['l_is_commend']; 9 $lesson['l_is_hot']=$request['l_is_hot']; 10 $lesson['l_click']=$request['l_click']; 11 $lesson->save(); 12 //dd($lesson['l_id']); 13 //dd($lesson->toArray()); 14 15 //二、插入标签课程数据--关系表 16 $tags=$request['tags']; 17 foreach ($tags as $tag){ 18 $tag_lesson=[]; 19 $tag_lesson['tl_t_id']=$tag; 20 //$tag_lesson['tl_l_id']=$lesson['l_id']; 21 //TagAndLesson::create($tag_lesson); 22 //dd($tag_lesson); 23 $lesson->hasManyLessonTags()->create($tag_lesson); 24 25 } 26 27 28 //videos数据过来的时候是json数据,true表示转成数组而非对象 29 $videos=json_decode($request['videos'],true); 30 //dd($videos); 31 foreach ($videos as $video){ 32 unset($video['v_id']); 33 $lesson->videos()->create($video); 34 // $lesson->videos()->create([ 35 // 'title'=>$video['title'], 36 // 'path'=>$video['path'], 37 // ]); 38 } 39 }); 40 41 42 return redirect('/admin/lesson'); 43 44 45 }