zoukankan      html  css  js  c++  java
  • legend3---lavarel多对多模型操作实例

    legend3---lavarel多对多模型操作实例

    一、总结

    一句话总结:

    在多对多模型中,增加关系表的数据 需要 弄一个和关系表一对多的模型关系

    1、在lavarel关系模型中,课程和标签表是多对多,那么我如何增加课程标签联合表的数据?

    定义一个一对多的模型,因为课程和标签表是多对多,那么课程和课程标签联合表是一对多
    //与课程标签联合表的一对多关系
    public function hasManyLessonTags(){
      return $this->hasMany(AppModelAdminTagAndLesson::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 AppModel;
     4 
     5 use IlluminateDatabaseEloquentModel;
     6 
     7 class Lesson extends Model
     8 {
     9     protected $primaryKey='l_id';
    10     /**
    11      * 与视频表模型的一对多关联
    12      * @return IlluminateDatabaseEloquentRelationsHasMany
    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('AppModelTag','tag_and_lessons','tl_l_id','tl_t_id');
    21     }
    22 
    23     //与课程标签联合表的一对多关系
    24     public function hasManyLessonTags(){
    25         return $this->hasMany(AppModelAdminTagAndLesson::class,'tl_l_id','l_id');
    26     }
    27 }

    app/Model/Tag.php

    <?php
    
    namespace AppModel;
    
    use IlluminateDatabaseEloquentModel;
    
    class Tag extends Model
    {
        //$guarded表示不允许批量填充的字段
        protected $primaryKey='t_id';
        protected $guarded=[];
    
    }

    app/Model/Admin/TagAndLesson.php

    <?php
    
    namespace AppModelAdmin;
    
    use IlluminateDatabaseEloquentModel;
    
    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     }
     
  • 相关阅读:
    记处理PostgreSQL连接太多的问题
    记服务器迁移上云出现故障
    PostgreSQL-迁移同步序列
    为什么你的pgbouncer连接这么慢
    TS基础知识储备
    前端实在好用的工具类库 【后续持续添加若有请留言添加积累供大家使用】
    Vue 3 + Typescript + Vite2.0 搭建移动端 代码规范以及注意的点
    flutter2.0 环境搭建(window环境下Mac自行查看官网即可)
    vite2.0+vue3+ts前端最新热门技术项目搭建
    React官方状态管理库—— Recoil
  • 原文地址:https://www.cnblogs.com/Renyi-Fan/p/11605426.html
Copyright © 2011-2022 走看看