legend3---lavarel多對多模型操做實例

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     }
相關文章
相關標籤/搜索