当前位置:  首页>> 技术小册>> Yii2框架从入门到精通(上)

6.3.2 ActiveQuery成员方法简介

在Yii2框架中,ActiveQuery是处理数据库查询的强大工具,它继承自yii\db\Query,并添加了对Active Record模型的额外支持。通过ActiveQuery,开发者可以构建复杂的查询逻辑,包括条件筛选、排序、分页等,而无需编写复杂的SQL语句。本章节将详细介绍ActiveQuery类中的一些核心成员方法,帮助读者从基础到精通地掌握这一强大功能。

6.3.2.1 where():条件筛选

where()方法是ActiveQuery中最常用的方法之一,用于设置查询条件。它接受多种参数格式,使得构建复杂的查询条件变得灵活而强大。

  • 基本用法:传递一个字符串作为SQL条件语句,同时可以通过第二个参数(可选)传递绑定参数,以防止SQL注入。

    1. $query = User::find()->where('status = :status', [':status' => 1]);
  • 使用数组:以数组形式传递条件,其中每个元素代表一个条件,数组可以是一维的(AND连接)或二维的(自定义连接逻辑)。

    1. // AND连接
    2. $query = User::find()->where([
    3. 'status' => 1,
    4. 'type' => 'admin',
    5. ]);
    6. // 使用操作符
    7. $query = User::find()->where([
    8. 'and',
    9. ['>', 'age', 18],
    10. ['<', 'age', 60],
    11. ]);
    12. // 自定义逻辑(OR)
    13. $query = User::find()->where([
    14. 'or',
    15. ['status' => 1],
    16. ['type' => 'guest'],
    17. ]);
  • 表达式对象:还可以使用yii\db\Expression对象来表示复杂的表达式。

6.3.2.2 andWhere()orWhere()

这两个方法用于在现有查询条件上添加额外的AND或OR条件,而不会覆盖之前设置的条件。

  • 示例

    1. $query = User::find()->where(['status' => 1])->andWhere(['>', 'age', 18]);
    2. // 相当于 WHERE status = 1 AND age > 18
    3. $query = User::find()->where(['status' => 1])->orWhere(['type' => 'guest']);
    4. // 相当于 WHERE status = 1 OR type = 'guest'

6.3.2.3 orderBy():排序

orderBy()方法用于指定查询结果的排序规则。可以指定一个或多个字段,以及每个字段的排序方向(ASC升序或DESC降序)。

  • 基本用法
    1. $query = User::find()->orderBy('id ASC, name DESC');
    2. // 或者使用数组形式
    3. $query = User::find()->orderBy(['id' => SORT_ASC, 'name' => SORT_DESC]);

6.3.2.4 limit()offset():分页

limit()offset()方法用于实现分页功能,limit()设置返回的记录数,offset()设置跳过的记录数。

  • 示例
    1. $query = User::find()->limit(10)->offset(20);
    2. // 跳过前20条记录,返回接下来的10条记录

6.3.2.5 join():连接查询

join()方法用于执行SQL JOIN操作,可以连接一个或多个表。它支持INNER JOIN、LEFT JOIN等多种JOIN类型。

  • 示例
    1. $query = User::find()->joinWith('profiles', true, 'LEFT JOIN');
    2. // 或者更详细的JOIN
    3. $query = User::find()->join('INNER JOIN', 'profile', 'user.id = profile.user_id');

6.3.2.6 groupBy():分组

groupBy()方法用于指定SQL查询中的GROUP BY子句,常用于聚合查询。

  • 示例
    1. $query = Order::find()->select('status, COUNT(*) as count')->groupBy('status');

6.3.2.7 having():分组后筛选

having()方法用于在GROUP BY分组后对结果进行筛选,与where()不同的是,它作用于聚合函数的结果上。

  • 示例
    1. $query = Order::find()->select('status, COUNT(*) as count')
    2. ->groupBy('status')
    3. ->having('count > 10');

6.3.2.8 select():选择字段

select()方法用于指定查询需要返回的字段。默认情况下,会返回模型的所有字段。

  • 示例
    1. $query = User::find()->select(['id', 'username']);

6.3.2.9 indexBy():结果集索引

indexBy()方法允许你指定一个字段,该字段的值将作为结果数组中元素的键。

  • 示例
    1. $users = User::find()->indexBy('id')->all();
    2. // 结果将是一个数组,其键为用户的ID

6.3.2.10 asArray():以数组形式返回结果

默认情况下,ActiveQuery返回的是Active Record对象的数组。使用asArray()方法可以使查询结果直接以关联数组的形式返回,提高性能。

  • 示例
    1. $users = User::find()->asArray()->all();
    2. // $users中的每个元素都是一个数组,而不是User对象

6.3.2.11 count()sum()avg() 等聚合函数

ActiveQuery还提供了多种聚合函数方法,如count()sum()avg()等,用于执行聚合查询。

  • 示例
    1. $total = User::find()->count(); // 返回用户总数
    2. $totalAge = User::find()->select('SUM(age)')->scalar(); // 返回用户年龄总和

总结

ActiveQuery是Yii2框架中处理数据库查询的强大工具,通过其丰富的成员方法,开发者可以灵活地构建各种复杂的查询逻辑。从基本的条件筛选、排序、分页,到高级的连接查询、分组筛选、聚合函数等,ActiveQuery都提供了简洁而强大的支持。掌握这些成员方法,将有助于你更高效、更安全地处理数据库操作,从而编写出更优秀的Yii2应用程序。