首页
技术小册
AIGC
面试刷题
技术文章
MAGENTO
云计算
视频课程
源码下载
PDF书籍
「涨薪秘籍」
登录
注册
1.1 PHP语言发展历史及其适合的应用领域
1.2 什么是框架
1.3 为什么要用框架开发
1.4 自定义框架
1.4.1 MVC框架模式的实现
1.4.2 入口文件
1.4.3 应用(前端控制器)
1.4.4 从自定义框架到Yii2框架
2.1 Yii简介
2.1.1 什么是Yii框架技术
2.1.2 Yii2的优点
2.1.3 应用案例
2.2 下载Yii2
2.3 运行应用
2.4 输出“Hello World”
2.5 入口文件
2.6 应用主体
2.7 MVC框架模式
2.8 Yii2框架中的控制器
2.9 Yii2框架中的视图
2.10 项目实现迭代一:渲染首页、列表页和内容页视图
3.1 布局概述
3.2 项目实现迭代二:创建并使用布局渲染首页视图
3.3 Controller类的render()方法执行流程
3.4 应用级布局
3.5 嵌套布局
3.6 项目实现迭代三:使用嵌套布局渲染“新闻中心”列表页
3.7 视图文件的存储路径
4.1 模块概述
4.2 使用Gii创建模块
4.3 模块中的资源文件
4.4 项目实现迭代四:文章管理
5.1 ActiveRecord模型概述
5.2 通过CRUD(增查改删)操作理解ActiveRecord类
5.2.1 文章表(ds_article)
5.2.2 在配置文件中初始化数据库连接
5.2.3 创建ActiveRecord模型
5.2.4 通过查询操作理解ActiveRecord类
5.2.5 通过插入和更新操作理解ActiveRecord类
5.2.6 通过删除操作理解ActiveRecord类
5.3 项目实现迭代五:首页“行业百科”数据查询
5.4 项目实现迭代六:在“文章添加”页面实现数据插入
6.1 ActiveRecord模型类的find()方法与查询执行流程
6.2 查询方法find()实例
6.2.1 实现带有逻辑运算符和比较运算符的查询
6.2.2 实现范围比较查询
6.2.3 实现模糊查询
6.3 查询构建类ActiveQuery
6.3.1 ActiveQuery成员属性简介
6.3.2 ActiveQuery成员方法简介
6.3.3 Query类where()成员方法简介
6.4 关联查询
6.5 项目实现迭代七:完成首页中的数据填充
6.5.1 实现幻灯片切换
6.5.2 实现成功案例
6.5.3 实现其他栏目的文章内容查询
当前位置:
首页>>
技术小册>>
Yii2框架从入门到精通(上)
小册名称:Yii2框架从入门到精通(上)
### 6.3 查询构建类 ActiveQuery 在Yii2框架中,`ActiveQuery` 类是处理数据库查询的核心工具之一,它继承自 `yii\db\Query` 并增加了对 Active Record 模型的特定支持。通过使用 `ActiveQuery`,开发者可以构建强大而灵活的数据库查询,同时保持代码的简洁性和可维护性。本章将深入探讨 `ActiveQuery` 的使用,包括其基本用法、高级查询技巧、以及如何通过它实现关系查询和条件查询。 #### 6.3.1 ActiveQuery 基础 `ActiveQuery` 通常是通过调用 Active Record 模型的 `find()` 方法创建的。这个方法返回一个 `ActiveQuery` 实例,该实例已经预配置为查询对应模型的表。 ```php // 假设有一个 User 模型 $query = User::find(); ``` 此时,`$query` 是一个未执行的查询对象,可以通过链式调用添加各种条件和方法来进一步定义查询。 #### 6.3.2 查询条件 `ActiveQuery` 提供了多种方法来添加查询条件,最常用的包括 `where()`, `andWhere()`, `orWhere()`, `filterWhere()` 等。 - **where()**:用于添加“AND”条件。 ```php $query->where(['status' => 1]); ``` - **andWhere()** 和 **orWhere()**:在现有条件的基础上添加额外的“AND”或“OR”条件。 ```php $query->where(['status' => 1]) ->andWhere(['>', 'age', 18]); $query->where(['status' => 1]) ->orWhere(['role' => 'admin']); ``` - **filterWhere()**:与 `where()` 类似,但它会自动处理数组值中的空值,使其更适用于表单数据的过滤。 ```php $query->filterWhere(['name' => $name, 'email' => $email]); ``` #### 6.3.3 排序与限制 查询结果可以通过 `orderBy()` 进行排序,使用 `limit()` 和 `offset()` 来限制结果集的大小和偏移量。 - **orderBy()**:根据一个或多个字段对结果集进行排序。 ```php $query->orderBy(['created_at' => SORT_DESC]); ``` - **limit()** 和 **offset()**:用于分页或限制查询结果的数量。 ```php $query->limit(10)->offset(20); // 跳过前20条,取接下来的10条 ``` #### 6.3.4 高级查询技巧 `ActiveQuery` 支持更复杂的查询操作,如分组、聚合、子查询等。 - **groupBy()**:根据一个或多个字段对结果集进行分组。 ```php $query->select('status, COUNT(*) as count') ->groupBy('status'); ``` - **having()**:用于对分组后的结果进行过滤。 ```php $query->groupBy('status') ->having(['>', 'COUNT(*)', 10]); ``` - **join()**:执行SQL JOIN操作,支持INNER JOIN、LEFT JOIN等多种类型。 ```php $query->joinWith('profiles', true, 'LEFT JOIN'); ``` - **select()**:自定义SELECT子句,可以选择部分字段或计算字段。 ```php $query->select(['id', 'name', 'CONCAT(first_name, " ", last_name) AS full_name']); ``` #### 6.3.5 索引与缓存 为了提高查询效率,Yii2 允许为 `ActiveQuery` 结果集设置索引或启用查询缓存。 - **indexBy()**:根据某个字段的值将结果集索引化。 ```php $users = User::find()->indexBy('id')->all(); ``` - **cache()**:为查询结果启用缓存。 ```php $duration = 3600; // 缓存持续时间,单位为秒 $dependency = new \yii\caching\DbDependency(['sql' => 'SELECT MAX(updated_at) FROM user']); $query->cache($duration, $dependency)->all(); ``` #### 6.3.6 关系查询 Yii2 的 Active Record 支持通过定义关系(如一对一、一对多等)来简化复杂数据结构的查询。使用 `ActiveQuery` 的 `with()` 方法可以预加载这些关系,减少数据库查询次数。 - **定义关系**:在模型中定义关系。 ```php class User extends \yii\db\ActiveRecord { public function getProfiles() { return $this->hasOne(Profile::className(), ['user_id' => 'id']); } } ``` - **预加载关系**:使用 `with()` 方法预加载关系。 ```php $users = User::find()->with('profiles')->all(); ``` #### 6.3.7 批量查询与动态查询 在某些场景下,你可能需要根据用户输入动态构建查询条件。Yii2 提供了灵活的机制来处理这类需求。 - **动态构建查询**:根据条件数组动态添加查询条件。 ```php $conditions = ['status' => 1]; if (!empty($name)) { $conditions['name'] = $name; } $query = User::find()->where($conditions); ``` - **批量查询**:使用 `batch()` 或 `each()` 方法处理大量数据,减少内存消耗。 ```php foreach (User::find()->batch(100) as $users) { // 处理每批用户 } // 或者使用 each() 逐个处理 User::find()->each(function ($user) { // 处理每个用户 }); ``` #### 6.3.8 总结 `ActiveQuery` 是 Yii2 框架中用于构建和执行数据库查询的强大工具。它提供了丰富的API来支持各种查询需求,包括条件查询、排序、分组、聚合、关系查询等。通过熟练使用 `ActiveQuery`,开发者可以构建出既高效又易于维护的数据库查询代码。在实际开发中,结合模型的关系定义和查询缓存的使用,可以进一步提升应用性能和用户体验。希望本章内容能帮助你更深入地理解和掌握 Yii2 中的 `ActiveQuery` 使用技巧。
上一篇:
6.2.3 实现模糊查询
下一篇:
6.3.1 ActiveQuery成员属性简介
该分类下的相关小册推荐:
PHP8入门与项目实战(5)
Swoole高性能框架-Hyperf
全栈工程师修炼指南
PHP底层原理及源码分析
PHP程序员面试算法宝典
Laravel(10.x)从入门到精通(十五)
Laravel(10.x)从入门到精通(十六)
HTTP权威指南
PHP安全之道
PHP面试指南
PHP高并发秒杀入门与实战
Laravel(10.x)从入门到精通(九)