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

12 篇文章 0 订阅

现在有三张表: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]);
}

这样在 dataprofession 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}}形式即可;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值