legend3---lavarel多对多模型操作实例
生活随笔
收集整理的這篇文章主要介紹了
legend3---lavarel多对多模型操作实例
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
legend3---lavarel多對多模型操作實例
一、總結
一句話總結:
在多對多模型中,增加關系表的數據 需要 弄一個和關系表一對多的模型關系
?
1、在lavarel關系模型中,課程和標簽表是多對多,那么我如何增加課程標簽聯合表的數據?
定義一個一對多的模型,因為課程和標簽表是多對多,那么課程和課程標簽聯合表是一對多
//與課程標簽聯合表的一對多關系 public function hasManyLessonTags(){return $this->hasMany(\App\Model\Admin\TagAndLesson::class,'tl_l_id','l_id'); }?
//2、插入標簽課程數據--關系表 $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);}?
2、在lavarel關系模型中,定義模型關系的第一個參數是什么意思:例如$this->hasMany(Video::class,'v_l_id','l_id');?
關聯的模型,也就是【最終要獲取數據的表模型】,這里是哪個模型就表示要操作哪個表
?
3、在lavarel關系模型中,課程和標簽表是多對多,我在定義好了多對多的模型關系,我能否用這個模型關系增加課程標簽聯合表的數據?
不能,因為模型關系的第一個參數是最終要操作數據的表模型
?
?
?
二、lavarel多對多模型操作實例
1、關系和數據表結構
課程和標簽表是多對多
課程表:lessons
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_lessons
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;?
?
2、模型代碼
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 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.php
<?phpnamespace App\Model;use Illuminate\Database\Eloquent\Model;class Tag extends Model {//$guarded表示不允許批量填充的字段protected $primaryKey='t_id';protected $guarded=[];}?
app/Model/Admin/TagAndLesson.php
<?phpnamespace App\Model\Admin;use Illuminate\Database\Eloquent\Model;class TagAndLesson extends Model {// protected $primaryKey='tl_id';protected $guarded=[]; }?
3、控制器中使用的代碼
app/Http/Controllers/Admin/LessonController.php
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 //2、插入標簽課程數據--關系表 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 }?
?
轉載于:https://www.cnblogs.com/Renyi-Fan/p/11605426.html
總結
以上是生活随笔為你收集整理的legend3---lavarel多对多模型操作实例的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 黑马lavarel教程---5、模型操作
- 下一篇: 黑马lavarel教程---11、响应处