插件窝 干货文章 如何在ThinkPHP6中使用ORM进行多表关联查询

如何在ThinkPHP6中使用ORM进行多表关联查询

关联 查询 class Student 563    来源:    2024-10-24

随着软件开发技术的不断发展,许多开发者追求的不只是代码的效率和实用性,还包括代码的可读性和可维护性。orm(object-relational mapping)显然能够满足这一需求。orm可以帮助我们将数据库中的关系数据映射到对象之间的关系,从而减少了程序员所需的数据库交互代码量。thinkphp6框架使用了orm技术,使得开发者可以方便地进行关系型数据库的操作。本文将介绍如何在thinkphp6中使用orm进行多表关联查询。

一、使用ORM进行单表查询

在使用ORM进行多表关联查询之前,我们需要首先掌握如何使用ORM进行单表查询。

ThinkPHP6中使用ORM查询记录操作非常方便。只需要在控制器中实例化相应模型,然后调用模型中的方法即可。例如,我们需要查询一张学生表中的数据。

首先,在application目录下创建一个名为Student的模型文件。在该文件中通过继承 hinkModel类来定义学生表的属性。

立即学习“PHP免费学习笔记(深入)”;

<?php

namespace appmodel;

use thinkModel;

class Student extends Model
{

}

然后在控制器中实例化Student模型并调用该模型中已有的查询方法即可完成单表查询。

<?php

namespace appcontroller;

use appmodelStudent;

class StudentController
{
    public function index()
    {
        $student = new Student();
        $list = $student->select();
        dump($list);
    }
}

在运行contoller中的index方法之后,我们就可以在页面上看到学生表中的所有记录信息了,非常方便。

二、使用ORM进行简单多表关联查询

在ThinkPHP6中,进行数据库关联查询并不需要手动编写SQL联表查询语句。ORM会自动解析模型之间的关联关系,然后自动生成相应的SQL查询语句。开发者无需了解SQL语句的详细语法,只需要在模型中定义好关联关系,然后在控制器中调用查询方法即可完成多表联合查询。

1、一对一关联查询

当两个数据库表之间存在一对一的关系时,我们可以使用一对一关联查询。例如,在学生表中,一个学生只能对应一个班级,因此这两个表之间存在一对一的关系。我们可以使用ORM来查询学生表中信息,并一并查询出他所在的班级信息。

首先,在Student模型中定义这两个表之间的一对一关联关系。

<?php

namespace appmodel;

use thinkModel;

class Student extends Model
{
    public function grade()
    {
        return $this->hasOne('Grade', 'id', 'grade_id');
    }
}

在关联方法中,第一个参数'Grade'表示要进行关联操作的表,第二个参数'id'表示Grade表中关联的字段,第三个参数'grade_id'表示Student表中关联的字段。

然后在控制器中调用模型中的with方法,即可查询出学生表中的所有信息及其所在的班级信息。

<?php

namespace appcontroller;

use appmodelStudent;

class StudentController
{
    public function index()
    {
        $list = Student::with('grade')->select();
        dump($list);
    }
}

通过使用ORM,我们可以非常方便地查询出学生表中的所有信息及其所在班级的相关信息。这种方式就是一对一关联查询。

2、一对多关联查询

当两个数据库表之间存在一对多的关系时,我们可以使用一对多关联查询。例如,在学生表中,一个班级可以有多个学生,就存在了一对多的关系。我们可以使用ORM查询出班级信息,并一并查询出班级中所有的学生信息。

首先,在Grade模型中定义这两个表之间的一对多关联关系。

<?php

namespace appmodel;

use thinkModel;

class Grade extends Model
{
    public function student() 
    {
        return $this->hasMany('Student', 'grade_id', 'id');
    }
}

在关联方法中,第一个参数'Student'表示要进行关联操作的表,第二个参数'grade_id'表示Student表中关联的字段,第三个参数'id'表示Grade表中关联的字段。

然后在控制器中调用模型中的with方法,即可查询出班级中所有学生的信息。

<?php

namespace appcontroller;

use appmodelGrade;

class GradeController
{
    public function index()
    {
        $list = Grade::with('student')->select();
        dump($list);
    }
}

这种方式就是一对多关联查询。

三、使用ORM进行多个一对多关联查询

当我们在开发中需要查询多个一对多关联表时,我们可以使用模型的嵌套关联方式。例如,我们现在需要查询学校的信息,这个学校有多个班级,每个班级有多个学生,我们就需要使用嵌套关联方法。

首先,在Teacher模型中定义一对多的关联关系。

<?php

namespace appmodel;

use thinkModel;

class Teacher extends Model
{
    public function grade() 
    {
        return $this->hasMany('Grade', 'teacher_id', 'id');
    }
}

然后在Grade模型中定义一对多的关联关系。

<?php

namespace appmodel;

use thinkModel;

class Grade extends Model
{
    public function student() 
    {
        return $this->hasMany('Student', 'grade_id', 'id');
    }

    public function teacher() 
    {
        return $this->belongsTo('Teacher', 'teacher_id', 'id');
    }
}

在关联方法中,belongsTo表示当前模型的外键关联的是该模型关联表的主键,即Teacher表的主键对应Grade表中的teacher_id字段。

最后,在控制器中调用模型中的with方法,即可完成多个一对多关联的查询。

<?php

namespace appcontroller;

use appmodelTeacher;

class TeacherController
{
    public function index()
    {
        $list = Teacher::with([
            'grade' => function($query) {
                $query->with('student');
            }
        ])->select();
        dump($list);
    }
}

通过以上一系列的操作,我们就可以完成多个一对多关联的查询。

总结

ORM技术的出现一定程度上减少了程序开发的难度,ThinkPHP6框架的ORM更是使得开发人员在关于数据库操作方面更为灵活方便。了解和掌握ORM的操作方法,可以使我们在数据查询时更有效率,更加精准,从而为我们后续的开发带来很大的便利。