这篇文章咱们来看看在 Yii2 之中的 Active Record,为啥要将 Active Record 单独出来讲呢?由于我的认为这是 Yii(不论是 Yii1.1 仍是 Yii2)最强大的一部分功能之一,况且又赶上在 Yii2 中其实对 Active Record的改进仍是比较多的,因此咱们就经过这篇文章来瞅瞅 Yii2 的 Active Record 新特性。php
Yii2的Active Record首先值得称道的一点就是它已经能够支持更多的数据库,包括一些NoSQL类型的数据库如MongoDB,还有一些流行的存储后端如: elasticsearch
, redis
, Sphinx search
也获得很好的支持,如今真是随意你怎么玩数据了。由于咱们在想换一个存储后端的时候能够轻松地在配置文件里切换过来,彻底不用去修改Active Record的代码,酷毙!redis
在Yii2中使用Active Record的时候,第一个最直观的感觉可能就是model()调用已经跟Yii1.1变得不一样了,能够说全部的查询函数都源自 find()
或 findBySql()
这两个函数,因此像在Yii1.1中的Post::model()->findAll()
等函数就没有了。这里对Active Record的查询模块介绍都是很简单的,固然也可能包含一些我的的主观因素在里面,不说废话,若是你能看看下面这些来自官方文档中Active Record介绍的代码片断你就会变得很清晰。sql
<?php // 检索出全部的customer而后根据id排序: $customers = Customer::find() ->where(['status' => Customer::STATUS_ACTIVE]) ->orderBy('id') ->all(); // 查找出id为1的customer(注意时一个): $customer = Customer::find() ->where(['id' => 1]) ->one(); // 返回 *active* customers的数量: $count = Customer::find() ->where(['status' => Customer::STATUS_ACTIVE]) ->count(); // 找到全部将id做为索引的customer: $customers = Customer::find()->indexBy('id')->all(); // $customers array is indexed by customer IDs // 用查询语句查找全部的customer: $sql = 'SELECT * FROM customer'; $customers = Customer::findBySql($sql)->all();
还有一个值得注意的地方是,在Yii1.1中使用的findByPk()
和find()
在Yii2中有了新的替代者,数据库
<?php // 查找一个id为1的customer: $customer = Customer::findOne(1); // 找到id为1的 *active* customer: $customer = Customer::findOne([ 'id' => 1, 'status' => Customer::STATUS_ACTIVE, ]); // 查找出id为1,或2,或3的全部customer: $customers = Customer::findAll([1, 2, 3]); // 找到状态为 "deleted" 的customer: $customer = Customer::findAll([ 'status' => Customer::STATUS_DELETED, ]);
在Yii2中,再也不存在relations()
函数,而是使用getters
的方式返回一个ActiveQuery
对象后端
class Post extends yii/db/ActiveRecord{ public function getComments() { return $this->hasMany('Comment', array('post_id' => 'id')); } }
可是关联性仍是可使用相似$game->players
,不过在Yii2你能够根据本身的状况来自定义你的查询环境(查询语句),好比:数组
$comments = $post->getComments()->andWhere('approve=1')->all();
但目前为止若是你觉Active Record仍是无法说服以为它很强大,那么你能够好好看看这里。我会在这里罗列一些在Yii2中Active Record的(我以为还不错的)细微的小改进,不过也是很贴心,由于在开发过程当中,你可能更喜欢将查询到的数据存到一个数组里,这样不只会方便咱们在Views中的输出,也在必定程度上节约了内存,因而,我在这里推荐你调用asArray()
这个函数yii2
$posts = Post::find()->asArray()->all();
说到内存,上面的函数仍是不能知足你的需求?所有查出来仍是太大了?你想限制一下内存?OK,在Yii2中,你可使用batch()
函数来限制你的查询请求;PS:batch就是批量的意思app
// 一次查询10个 foreach (Post::find()->batch(10) as $posts) { // $posts 是一个包含10个(有可能更少)Post对象的数组 } // 查询10个的同时一个一个输出 foreach (Post::find()->each(10) as $post) { // $post 是一个Post对象 } // 跟with一块儿使用 foreach (Post::find()->with('comments')->each() as $post) { }
另外,Yii2中已经自动支持数据库中的事务管理(transactions),因此你彻底不用担忧在使用数据查询,更新的时候是否开启了事务管理,Yii2已经帮你作好了这一切。yii
这些就是我在学习Yii2中总结的一些有关Active Record的改进,不得不说,Yii2的这些改进使得咱们的开发更友好,更优雅了,仅是Active Record,就可让人用的很爽,因此,上手Yii2吧elasticsearch