laravel5.4表之间的对应关系(二)

时间:2022-09-24 00:17:01

现在有三张表:edu_lesson课时表、edu_course课程表和edu_profession专业表
表结构数据如下:
edu_lesson课时表:

-- ----------------------------
-- Table structure for edu_lesson
-- ----------------------------
DROP TABLE IF EXISTS `edu_lesson`;
CREATE TABLE `edu_lesson` (
`lesson_id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键id',
`course_id` int(11) NOT NULL COMMENT '(归属)课程id',
`lesson_name` varchar(128) COLLATE utf8_unicode_ci NOT NULL COMMENT '课程名称',
`cover_img` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL COMMENT '课程封面图',
`video_address` varchar(128) COLLATE utf8_unicode_ci NOT NULL COMMENT '播放视频地址',
`lesson_desc` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL COMMENT '视频描述',
`lesson_duration` int(11) NOT NULL DEFAULT '0' COMMENT '视频分钟数',
`teacher_ids` varchar(128) COLLATE utf8_unicode_ci NOT NULL COMMENT '视频讲解老师ids',
`created_at` timestamp NULL DEFAULT NULL COMMENT '创建时间',
`updated_at` timestamp NULL DEFAULT NULL COMMENT '修改时间',
`deleted_at` timestamp NULL DEFAULT NULL COMMENT '删除时间',
PRIMARY KEY (`lesson_id`)
) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;


-- ----------------------------
-- Records of edu_lesson
-- ----------------------------
INSERT INTO `edu_lesson` VALUES ('1', '1', 'jquery选择器使用', null, '', '灵活的选择器', '30', '', null, null, null);
INSERT INTO `edu_lesson` VALUES ('2', '1', 'jquery事件操作', null, '', '诡异的事件', '45', '', null, null, null);
INSERT INTO `edu_lesson` VALUES ('3', '2', 'linux的编辑器vi', null, '', '很好强大', '25', '', null, null, null);
INSERT INTO `edu_lesson` VALUES ('4', '2', 'linux的编辑器常用命令很', null, '', '厉害', '17', '', null, null, null);
INSERT INTO `edu_lesson` VALUES ('5', '2', 'linux安装', null, '', '很快', '30', '', null, null, null);

edu_course课程表:

-- ----------------------------
-- Table structure for edu_course
-- ----------------------------
DROP TABLE IF EXISTS `edu_course`;
CREATE TABLE `edu_course` (
`course_id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键id',
`pro_id` int(11) NOT NULL COMMENT '(归属)专业id',
`course_name` varchar(128) COLLATE utf8_unicode_ci NOT NULL COMMENT '课程名称',
`course_price` decimal(7,2) NOT NULL DEFAULT '0.00' COMMENT '售价',
`course_desc` text COLLATE utf8_unicode_ci NOT NULL COMMENT '课程描述',
`cover_img` varchar(128) COLLATE utf8_unicode_ci DEFAULT NULL COMMENT '封面图',
`created_at` timestamp NULL DEFAULT NULL COMMENT '创建时间',
`updated_at` timestamp NULL DEFAULT NULL COMMENT '修改时间',
`deleted_at` timestamp NULL DEFAULT NULL COMMENT '删除时间',
PRIMARY KEY (`course_id`)
) ENGINE=InnoDB AUTO_INCREMENT=16 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;


-- ----------------------------
-- Records of edu_course
-- ----------------------------
INSERT INTO `edu_course` VALUES ('1', '2', 'jQuery', '19.50', '对javascript封装的功能包', null, null, null, null);
INSERT INTO `edu_course` VALUES ('2', '2', 'Linux', '5.60', '服务器端操作系统', null, null, null, null);
INSERT INTO `edu_course` VALUES ('3', '2', '面向对象', '12.90', '代码的高级封装', null, null, null, null);

edu_profession专业表:

-- ----------------------------
-- Table structure for edu_profession
-- ----------------------------
DROP TABLE IF EXISTS `edu_profession`;
CREATE TABLE `edu_profession` (
`pro_id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
`pro_name` varchar(64) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '专业名称',
`teacher_ids` varchar(60) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '任课老师的ids串,如 10,13,21',
`pro_desc` text COLLATE utf8mb4_unicode_ci COMMENT '简介',
`cover_img` char(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '封面图',
`carousel_imgs` char(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '轮播图片',
`created_at` timestamp NULL DEFAULT NULL COMMENT '创建时间',
`updated_at` timestamp NULL DEFAULT NULL COMMENT '修改时间',
`deleted_at` timestamp NULL DEFAULT NULL COMMENT '删除时间',
PRIMARY KEY (`pro_id`),
UNIQUE KEY `profession_pro_name_unique` (`pro_name`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;


-- ----------------------------
-- Records of edu_profession
-- ----------------------------
INSERT INTO `edu_profession` VALUES ('1', 'Java', null, null, null, null, null, null, null);
INSERT INTO `edu_profession` VALUES ('2', 'PHP', null, null, null, null, null, null, null);
INSERT INTO `edu_profession` VALUES ('3', 'IOS', null, null, null, null, null, null, null);

现在edu_lession表和edu_course表示一对一关系,在laravel实现方式为:

一、两表有直接的关系

1、首先:建立与lesson模型并编写方法course方法:

<?php

namespace App\Http\Models;

use Illuminate\Database\Eloquent\Model;

class Lesson extends Model
{

protected $table = "lesson";
protected $primaryKey = "lesson_id";
protected $fillable = ['course_id','lesson_name','cover_img','video_address','lesson_desc','lesson_duration','teacher_ids'];

//建立与course模型成1:1关系
public function course()
{

/*
* 参数一:需要关联的模型
* 参数二:在lesson指向course表的外键
* 参数三:在course表中的主键
* */

return $this->hasOne('App\Http\Models\course','course_id','course_id');
}

}

2、建立course表模型:

<?php

namespace App\Http\Models;

use Illuminate\Database\Eloquent\Model;

class Course extends Model
{

protected $table = "course";
protected $primaryKey = "course_id";
protected $fillable = ['pro_id','course_name','course_price','course_desc','cover_img'];
}

3、在lessonController控制器中取数据

    public function index{
$data= Lesson::with('course')//需要关联的模型名
->get();//数据本身是一个集合,里面每个单元都是一个小的lesson对象
return view('admin.lesson.index',['data'=>$data]);
}

这样在$data中就有了course表中相关的数据了

二、两表无直接关系

情景:lesson表和profession表没有直接的关,如果要取出profession表中的数据,怎么取?
解决思路:因为lesson表和course表有1:1关系,而course表和profession表有1:1关系,我们可以通过course表获取profession的数据

1、创建ProfessionModel模型:

<?php

namespace App\Http\Models;

use Illuminate\Database\Eloquent\Model;

class Profession extends Model
{

protected $table = "profession";
protected $primaryKey = "pro_id";
protected $fillable = ['pro_name','teacher_ids','pro_desc','cover_img','carousel_imgs'];

}

2、在CourseModel模型中创建方法:

    //给course建立与profession 1对1关系
public function profession()
{

return $this->hasOne('App\Http\Models\Profession','pro_id','pro_id');
}

3、在LessonController中的index方法中做修改:

    public function index{
$data= Lesson::->with(['course'=>function($c){//需要关联的模型名,$c表示关系模型类对象,也就是course
$c->orderBy('course_id','desc');//这里的条件作用于course表
$c->where('course_name','like','%jquery%');//这里的条件作用于course表,相当于select * from `edu_course` where `edu_course`.`course_id` in ('2') and `course_name` like '%jquery%' order by `course_id` desc
$c->with('profession');
}])
->get();//数据本身是一个集合,里面每个单元都是一个小的lesson对象
return view('admin.lesson.index',['data'=>$data]);
}

这样在 d a t a p r o f e s s i o n info可以获得正常的课时信息,也可以获得课程信息,也可以获得专业信息了

foreach($data as $v){
$v->课时字段;
$v->course->课程字段;
$v->course->profession->专业字段;
}

在模板中取数据:如:{{$data->course->profession->pro_name}}形式即可;