一对一关联
一对多关联

前言:本文仅介绍最常用的两个关联「一对一关联」「一对多关联」。

参考资料 :TP6 模型关联官方文档

一对一关联

参考资料:TP6 一对一关联官方文档

  1. hasOne() 正向关联,用于主表关联从表。
  2. belongsTo() 反向关联,用于从表反向关联主表。

关联查询
范例:教师表 正向关联 科目表
hasOne()基础用法
教师表文件 Teacher.php ↓

<?php

namespace app\index\model;

use think\Model;

class Teacher extends Model
{
    //定义 Teacher 表关联到科目表
    public function Course()
    {
        return $this->hasOne(Course::class,'tid','tid');
    }
}

控制器 Index.php 文件 ↓

<?php
namespace app\index\controller;

use app\BaseController;
use app\index\model\Teacher;

class Index extends BaseController
{
    public function index()
    {
        $teacher = new Teacher();
        $data = $teacher->find(1);
        //打印输出老师教授科目
        dump($data->course->cname);
    }
}

效果图 ↓

范例:科目表 反向关联 教师表
belongsTo() 基础用法
科目表文件 Course.php ↓

<?php

namespace app\index\model;

use think\Model;

class Course extends Model
{
    public function Teacher()
    {
        return $this->belongsTo(Teacher::class,'tid','tid');
    }
}

控制器 Index.php 文件 ↓

<?php
namespace app\index\controller;

use app\BaseController;
use app\index\model\Course;

class Index extends BaseController
{
    public function index()
    {
        $course = new Course();
        $data = $course->find(1);
        //打印输出教授科目老师
        dump($data->teacher->tname);
    }
}

效果图 ↓

根据关联数据查询
范例:查询老师 id = 2 的姓名与所教科目
hasWhere() 基础用法
控制器 Index.php 文件 ↓

<?php
namespace app\index\controller;

use app\BaseController;
use app\index\model\Course;

class Index extends BaseController
{
    public function index()
    {
        $course = new Course();
        //根据关联数据,查询 老师表 id = 2  所教课程 对应的tid,科目名称,和老师的名称
        $data = $course->hasWhere('teacher',['id' => '2'],'course.*,teacher.*')->select()->toArray();

        //闭包查询
        $data1 = $course->hasWhere('teacher',function ($query){
            $query->where([['id','=','2']]);
        },'course.*,teacher.*')->select()->toArray();
        //打印输出
        dump($data);
        dump($data1);
    }
}

效果图 ↓

一对一关联更新以或保存
save() 存在就更新,不存在就新增
更新范例:更新科目表 id = 1 的任课老师为 SnaiL
控制器 Index.php 文件↓

<?php
namespace app\index\controller;

use app\BaseController;
use app\index\model\Course;

class Index extends BaseController
{
    public function index()
    {
        $course = new Course();
        $data  = $course->find(1);
        echo '更新前<br>';
        dump($data->teacher->tname);
        $data->teacher->save(['tname' => 'SnaiL']);

        echo '更新后<br>';
        $data  = $course->find(1);
        dump($data->teacher->tname);
    }
}

效果图↓

新增范例:新增 [物理] 科目,任课老师为 MaMaKa

<?php
namespace app\index\controller;

use app\BaseController;
use app\index\model\Teacher;

class Index extends BaseController
{
    public function index()
    {
        $teacher = new Teacher();
        $data = ['tname' => 'MaMaKa','tid' => '01'];

        $id = $teacher->insertGetId($data);
        $teach = $teacher->find($id);
        $teach->course()->save(['cname' => '物理','cid' => '01']);

        $rs = $teacher->find($id);
        dump($rs->course->cname);
    }
}

效果图 ↓

一对多关联

参考资料:TP6 一对多关联官方文档

  1. 一切操作,对标一对一关联范例😂😂😂
  2. 不是我懒,而是我真的懒