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. 记录:初入Java环境部署踩坑

    1.在部署环境之前,先确定大佬们用的哪几种软件,然后依次下载,安装,IDEA, JDK, Tomcat, Maven.    什么是JDK?    JDK是 Java 语言的软件开发工具包,主要用于移 ...

  2. mint-ui下拉加载(demo实例)

    <template> <div class="share"> <div class="header"> <div cl ...

  3. TCP坚持定时器

    窗口探查(window probe) 当接收方TCP缓冲区没有剩余空间后,在ACK中会通知发送方window=0,此时发送方就暂停发送数据.当接收方TCP缓冲区又有空间后,会再次发送一个ACK,告知其 ...

  4. 解决办法:Message: 对实体 "useUnicode" 的引用必须以 ';' 分隔符结尾

    Hibernate 5.3.1 INFO: HHH000206: hibernate.properties not foundException in thread "main" ...

  5. STM32WB SRAM2

    SRAM2存储: 1.挂接总线及地址大小 2.地址镜像 3.RDP(read protection)等级 4.不同等级下的访问状态 5.声明位于SRAM2区中的数据 1)在icf文件中定义region ...

  6. 7.控制计划任务crontab命令

    at 命令是针对仅运行一次的任务,循环运行的例行性计划任务,linux系统则是由 cron (crond) 这个系统服务来控制的Linux 系统上面原本就有非常多的计划 性工作,因此这个系统服务是默认 ...

  7. Successor HDU - 4366 (预处理,线段树,dfs序)

    Successor HDU - 4366 Sean owns a company and he is the BOSS.The other Staff has one Superior.every s ...

  8. View相关面试问题-View绘制面试问题详解

    View树的绘制流程: measure()  -->  layout() --> onDraw(),具体使用这个可以参考之前实现的自定义的博客:[http://www.cnblogs.co ...

  9. Hdu 1851 Nim+巴什博弈

    写出SG表  发现SG函数规律为Mi%(Li+1) #include<bits/stdc++.h> using namespace std; int main() { int t; cin ...

  10. LeetCode03 - 无重复字符的最长子串(Java 实现)

    LeetCode03 - 无重复字符的最长子串(Java 实现) 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/longest-substri ...