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

 <?php

 namespace App\Model;

 use Illuminate\Database\Eloquent\Model;

 class Lesson extends Model
{
protected $primaryKey='l_id';
/**
* 与视频表模型的一对多关联
* @return \Illuminate\Database\Eloquent\Relations\HasMany
*/
public function videos(){
return $this->hasMany(Video::class,'v_l_id','l_id');
} //与标签的多对多关系
public function hasManyTags(){
return $this->belongsToMany('App\Model\Tag','tag_and_lessons','tl_l_id','tl_t_id');
} //与课程标签联合表的一对多关系
public function hasManyLessonTags(){
return $this->hasMany(\App\Model\Admin\TagAndLesson::class,'tl_l_id','l_id');
}
}

app/Model/Tag.php

<?php

namespace App\Model;

use Illuminate\Database\Eloquent\Model;

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

app/Model/Admin/TagAndLesson.php

<?php

namespace 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

     public function store(Request $request,Lesson $lesson)
{
DB::transaction(function () use ($request,$lesson) {
//dd($request->toArray());
$lesson['l_title']=$request['l_title'];
$lesson['l_introduce']=$request['l_introduce'];
$lesson['l_preview']=$request['l_preview'];
$lesson['l_is_commend']=$request['l_is_commend'];
$lesson['l_is_hot']=$request['l_is_hot'];
$lesson['l_click']=$request['l_click'];
$lesson->save();
//dd($lesson['l_id']);
//dd($lesson->toArray()); //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); } //videos数据过来的时候是json数据,true表示转成数组而非对象
$videos=json_decode($request['videos'],true);
//dd($videos);
foreach ($videos as $video){
unset($video['v_id']);
$lesson->videos()->create($video);
// $lesson->videos()->create([
// 'title'=>$video['title'],
// 'path'=>$video['path'],
// ]);
}
}); return redirect('/admin/lesson'); }
 

legend3---lavarel多对多模型操作实例的更多相关文章

  1. 黑马lavarel教程---5、模型操作(AR模式)

    黑马lavarel教程---5.模型操作(AR模式) 一.总结 一句话总结: AR: ActiveRecord :Active Record(活动记录),是一种领域模型模式,特点是一个模型类对应关系型 ...

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

    后盾网lavarel视频项目---lavarel多表关联一对多操作实例 一.总结 一句话总结: 1.一对多中多那个部分的数据前端通过json弄到服务器 2.所有通过一操作多的时候,都要用上模型中定义的 ...

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

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

  4. ThinkPHP6.0学习笔记-模型操作

    ThinkPHP模型 模型定义 在app目录下创建Model目录,即可创建模型文件 定义一个和数据库表相匹配的模型 use think\Model; class User extends Model ...

  5. django模型操作

    Django-Model操作数据库(增删改查.连表结构) 一.数据库操作 1.创建model表        

  6. django创建ORM模型、通过ORM模型操作单个表、ORM模型常用字段

    一.ORM简介 ORM ,全称Object Relational Mapping,中文叫做对象关系映射,通过ORM我们可以通过类的方式去操作数据库,而不用再写原生的SQL语句.通过把表映射成类,把行作 ...

  7. Qt 学习之路 2(56):使用模型操作数据库

    Qt 学习之路 2(56):使用模型操作数据库 (okgogo: skip) 豆子 2013年6月20日 Qt 学习之路 2 13条评论 前一章我们使用 SQL 语句完成了对数据库的常规操作,包括简单 ...

  8. 使用admin的步骤、必知必会13条、单表的双下划线、外键的操作、多对多的操作:

    MVC M: model 模型 与数据库交互 V: view 视图 HTML C:controller 控制器 流程 和 业务逻辑 MTV M:model ORM T:template 模板 HTML ...

  9. flowable ui 界面请假流程操作实例

    如题,网上的教程多是代码居多,UI界面操作实例那更是一页难求,楼主分享下几天来的入坑经历,希望有需要了解,但是不知道去哪里了解的小伙伴,看完我的文章后能有所启发,文章有不足之处还请指正,若有相关问题请 ...

随机推荐

  1. JavaScript笔记(2)

    函数 1.使用关键字function声明一个函数,如果需要传参数就传参,多个参数用逗号隔开,如果不需要传参数就不传 //函数声明 function name(num1,num2){ //方法体 } 2 ...

  2. vue实现吸顶

    data(){ return{ list:[], swiperOption:"", xiding : "", // 轮播高度 SwiperHeight:'' } ...

  3. JavaJDBC【五、事务】

    概念: 事务(Transaction)作为单个逻辑工作单元执行的一系列操作. 这些操作都是作为一个整体一起向系统提交,要么都执行,要么都不执行. 特点: 原子性:一个完整操作. 一致性:当事务完成时, ...

  4. zabbix监控项截图整理

    general监控项

  5. Delphi MSComm控件事件的介绍

  6. 单节点FastDFS与Nginx部署

    一.安装基本组件 1.安装编译需要的组件,必安装组件. yum install gcc-c++ 2.安装libevent函数库.pcre-devel zlib-devel必安装组件.     yum ...

  7. 使用比特币轻量钱包Electrum

    一.选择对应的钱包安装程序 浏览器打开 https://electrum.org/#download 选择windwos版本的安装程序 点击下载,并安装 二.运行Electrum的 testnet版本 ...

  8. PAT1005 继续(3n+1)猜想

    卡拉兹(Callatz)猜想已经在1001中给出了描述.在这个题目里,情况稍微有些复杂. 当我们验证卡拉兹猜想的时候,为了避免重复计算,可以记录下递推过程中遇到的每一个数.例如对 n=3 进行验证的时 ...

  9. 【转】关于 Ruby 解释器:一些你需要知道的

    关于 Ruby 解释器:一些你需要知道的 原文:Ruby Interpreters: What You Need to Know 使用正确的 Ruby 解释器来运行程序可以发挥重要作用,不幸的是很难找 ...

  10. 精选30道Java多线程面试题

    1.线程和进程的区别 进程是应用程序的执行实例.比如说,当你双击的Microsoft Word的图标,你就开始运行的Word的进程.线程是执行进程中的路径.另外,一个过程可以包含多个线程.启动Word ...