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
<?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多对多模型操作实例的更多相关文章
- 黑马lavarel教程---5、模型操作(AR模式)
黑马lavarel教程---5.模型操作(AR模式) 一.总结 一句话总结: AR: ActiveRecord :Active Record(活动记录),是一种领域模型模式,特点是一个模型类对应关系型 ...
- 后盾网lavarel视频项目---lavarel多表关联一对多操作实例
后盾网lavarel视频项目---lavarel多表关联一对多操作实例 一.总结 一句话总结: 1.一对多中多那个部分的数据前端通过json弄到服务器 2.所有通过一操作多的时候,都要用上模型中定义的 ...
- 后盾网lavarel视频项目---模型一对多关联简单实例
后盾网lavarel视频项目---模型一对多关联简单实例 一.总结 一句话总结: 在模型中定义一个方法来设置一对多关联:return $this->hasMany(Video::class); ...
- ThinkPHP6.0学习笔记-模型操作
ThinkPHP模型 模型定义 在app目录下创建Model目录,即可创建模型文件 定义一个和数据库表相匹配的模型 use think\Model; class User extends Model ...
- django模型操作
Django-Model操作数据库(增删改查.连表结构) 一.数据库操作 1.创建model表
- django创建ORM模型、通过ORM模型操作单个表、ORM模型常用字段
一.ORM简介 ORM ,全称Object Relational Mapping,中文叫做对象关系映射,通过ORM我们可以通过类的方式去操作数据库,而不用再写原生的SQL语句.通过把表映射成类,把行作 ...
- Qt 学习之路 2(56):使用模型操作数据库
Qt 学习之路 2(56):使用模型操作数据库 (okgogo: skip) 豆子 2013年6月20日 Qt 学习之路 2 13条评论 前一章我们使用 SQL 语句完成了对数据库的常规操作,包括简单 ...
- 使用admin的步骤、必知必会13条、单表的双下划线、外键的操作、多对多的操作:
MVC M: model 模型 与数据库交互 V: view 视图 HTML C:controller 控制器 流程 和 业务逻辑 MTV M:model ORM T:template 模板 HTML ...
- flowable ui 界面请假流程操作实例
如题,网上的教程多是代码居多,UI界面操作实例那更是一页难求,楼主分享下几天来的入坑经历,希望有需要了解,但是不知道去哪里了解的小伙伴,看完我的文章后能有所启发,文章有不足之处还请指正,若有相关问题请 ...
随机推荐
- 使用PyQt5自制文件查找工具,并生成EXE文件
一.工作中,有一个关键词查找工作,查找开发版本中使用的文本,有哪些词语是非法的,一个一个去查太累了,所以想到了用代码来实现.可后来想想,能否做成简单的小工具,大家都可以使用. 于是就着手编写工具.原来 ...
- Django的Auth模块
1 Auth模块是什么 Auth模块是Django自带的用户认证模块: 我们在开发一个网站的时候,无可避免的需要设计实现网站的用户系统.此时我们需要实现包括用户注册.用户登录.用户认证.注销.修改密码 ...
- python常用模块:包的使用、init作用、相对导入绝对导入与内置函数
今天主要讲的内容有: 一.包的详解二.相对导入和绝对导入三.内置模块补充 一.包的详解 1.包是什么 包其实也是一个模块,只不过是一个大的模块下包含一堆模块的载体 本质上也是一个文件夹,与普通文件的区 ...
- Linux ping route nslookup ifconfig arp traceroute
route -n 查看默认网关 ping -c 包个数 ping -s 包大小 host 目标主机 主机解析 nslookup 目标主机 arp -an 查看arp arp -s IP地 MA ...
- Linux根文件系统和目录结构及bash特性2
Linux系统上的文件类型: -:常规文件,即f d:directory,目录文件 b:block device,块设备文件,支持以“block”为单位进行随机访问 c:cha ...
- 9.RNN应用
import numpy as np from keras.datasets import mnist from keras.utils import np_utils from keras.mode ...
- POJ1639 算法竞赛进阶指南 野餐规划
题目描述 原题链接 一群小丑演员,以其出色的柔术表演,可以无限量的钻进同一辆汽车中,而闻名世界. 现在他们想要去公园玩耍,但是他们的经费非常紧缺. 他们将乘车前往公园,为了减少花费,他们决定选择一种合 ...
- “美登杯”上海市高校大学生程序设计邀请赛 **D. 小花梨的取石子游戏**
"美登杯"上海市高校大学生程序设计邀请赛 (华东理工大学) D. 小花梨的取石子游戏 Description 小花梨有
- zencart新增categories分类表字段步骤
zencart新增分类字段步骤 1.categories表新增字段related_categories.related_products ) ) NOT NULL; 2.修改admin\categor ...
- 8080 端口被占用的解决方法 netstat -ano;taskkill (命令行)
8080 端口被占用的解决方法 netstat -ano:taskkill (命令行) (ano 和 aon 都可以) 打开命令行: (1)netstat -ano 可查看端口使用情况,记住 PID ...