举杯邀月

Yii2数据库查询进阶操作(二)hasOne(一对一)、hasMany(一对多)的关联查询

摘要:数据库查询操作在工作中是最常见的,我们需要把数据库的数据根据需要的条件查询出来进行渲染页面或者接口返回。复杂的数据库设计中关联表是经常会存在,那么如何进行数据的连表查询呢?

数据库查询操作在工作中是最常见的,我们需要把数据库的数据根据需要的条件查询出来进行渲染页面或者接口返回。复杂的数据库设计中关联表是经常会存在,那么如何进行数据的连表查询呢?

在第一篇文章中,我们使用的是 leftJoin 的方式实现数据表的链表查询,其实还有一种方式,也可以实现一对一的链表查询:

hasOne

使用这个方法进行链表查询在有些情况下,个人觉得并没有使用 leftJoin 的方式灵活,但是在表的关联定义方面确实很直观。

使用这个方式进行查询,首先要在模型中定义个关联的表:

# Table1.php 模型定义关联
public function getTable2()
{
    return $this->hasOne(Table2::className(), ['table2_id'=>'table1_id']);
}

# 查询使用
$result = Table1::find()->where(['id'=>1])->one();
$result -> table2;  # 获取 table2 表中关联的数据
1
2
3
4
5
6
7
8
9
1
2
3
4
5
6
7
8
9
1
2
3
4
5
6
7
8
9

需要注意的地方:

  1. hasOne方法的第二个参数是字段的管理,数组的建是 Table2 表的关联字段,数组的值是 Table1 表的关联字段。
  2. 在查询的时候不能使用 asArray() 方法,因为 asArray() 方法返回结果是一个数组,自然也就没有了模型关联中的属性。
  3. 我们看到在模型中定义的方法名是 getTable2,而在使用时是直接只用的 table2,省略去的get,这也是值得注意的一个地方。

hasMany

这个方法其实和 hasOne 方法是类似的,只是一个是 hasOne 是一对一,hasMany 是一对多。

我们说了很多次一对一 一对多,那什么是一对一 什么是一对多,我们举个例子:

比如我们有一个订单系统,分为三个表:用户表、订单表、订单详情表。
一个用户可以下多个订单,一个订单对应一个订单详情这是数据库的设计,假设现在有一个用户下了两个订单,那么数据库就应该是这样的:

用户表

user_id user_name
1 小明
订单表
order_id create_time money user_id
1 20200103 30.05 1
2 20200103 80.30 1
订单详情表
order_id remarks
1 这是一个有很多字的备注
2 这是另一个有很多字的备注

那么根据这三个表,用户对于订单来说,就是一对多,一个用户可以有多个订单;订单对于订单详情来说,就是一对一,一个订单对应一个订单详情。

作者:举杯邀月

出处: http://www.hug-code.cn/archives/5fca075fbbd47.html

2020-09-26 标签: yii2