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. python+opencv+sift环境配置教程

    最近在做对应点估计homography,需要用到opencv,c++的接口不如python的接口来的方便 但是在安装python接口的opencv的时候,遇到了各种问题,主要是函数找不到的问题 比如在 ...

  2. 【1】Zookeeper概述

    一.前言 在"网络是不可靠的"这一前提下,分布式系统开发需要解决如下四个问题: 客户端如何访问众多服务?  解决方案:服务聚合,使用API网关 服务于服务之间如何通信?  解决方案 ...

  3. php基本变量

    结构体和联合体 struct(结构体) 和 union(联合体) 结构体是8字节对齐,不够8字节的部分则空出来: 联合体共用一个8字节,共享这8字节的内存,后使用的会覆盖先使用的 结构体和联合体在形式 ...

  4. xtrabackup备份恢复过程

    备份 1.全备 innobackupex --user=root --password=123456 --no-timestamp /backup/full 增加数据 mysql> insert ...

  5. 在Mysql中使用索引

    MySQL查询的优化是个老生常谈的问题,方法更是多种多样,其中最直接的就是创建索引. 这里通过一个简单的demo来实际用一下索引,看看索引在百万级别查询中速率的提升效果如何 所需数据可以从我前面的一篇 ...

  6. In Unix, what is tar, and how do I use it?

      In Unix, the name of the tar command is short for tape archiving, the storing of entire file syste ...

  7. XML基础综合案例【三】

    实现简单的学生管理系统 使用xml当做数据,存储学生信息 ** 创建一个xml文件,写一些学生信息 ** 增加操作1.创建解析器2.得到document 3.获取到根节点4.在根节点上面创建stu标签 ...

  8. LNMP安装与配置之CentOS7的安装。

    LNMP与LAMP是我们常见的两种网站服务器架构.LNMP代表的就是Linux系统下Nginx+MySQL+PHP/Python,LAMP代表的则是Linux系统下Apache+MySQL+PHP/P ...

  9. 检测udp端口

    linux 检测端口是否打开:nc -zuv ip 端口 服务器监听端口:nc -l -u ip 端口(可以发送和接受信息) 客户端检测端口:nc -u ip 端口(可以发送和接受信息) 查看监听的t ...

  10. c++中cin和cout的用法

    cin和cout是c++中的标准输入输出流. 一.cin cin的一般用法: cin>>变量a>>变量b>>变量c; cin会自动辨别变量的类型,如a可以是char ...