资讯专栏INFORMATION COLUMN

Yii2 优雅的 Active Record

刘福 / 1824人阅读

摘要:写在最后这些就是我在学习中总结的一些有关的改进,不得不说,的这些改进使得我们的开发更友好,更优雅了,仅是,就可以让人用的很爽,所以,上手吧原文来自

这篇文章我们来看看在 Yii2 之中的 Active Record,为啥要将 Active Record 多带带出来说呢?因为个人认为这是 Yii(不管是 Yii1.1 还是 Yii2)最强大的一部分功能之一,何况又遇上在 Yii2 中其实对 Active Record的改进还是比较多的,所以我们就通过这篇文章来瞅瞅 Yii2 的 Active Record 新特性。

1.支持更多的数据库

Yii2的Active Record首先值得称道的一点就是它已经可以支持更多的数据库,包括一些NoSQL类型的数据库如MongoDB,还有一些流行的存储后端如: elasticsearch, redis, Sphinx search也得到很好的支持,现在真是随意你怎么玩数据了。因为我们在想换一个存储后端的时候可以轻松地在配置文件里切换过来,完全不用去修改Active Record的代码,酷毙!

2.在Yii2中使用Active Record查询数据

在Yii2中使用Active Record的时候,第一个最直观的感受可能就是model()调用已经跟Yii1.1变得不同了,可以说所有的查询函数都源自 find()findBySql()这两个函数,所以像在Yii1.1中的Post::model()->findAll()等函数就没有了。这里对Active Record的查询模块介绍都是很简单的,当然也可能包含一些个人的主观因素在里面,不说废话,如果你能看看下面这些来自官方文档中Active Record介绍的代码片段你就会变得很清晰。

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中有了新的替代者,

 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,
    ]);
3.关联(Relations)

在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()这个函数

$posts = Post::find()->asArray()->all();

说到内存,上面的函数还是不能满足你的需求?全部查出来还是太大了?你想限制一下内存?OK,在Yii2中,你可以使用batch()函数来限制你的查询请求;PS:batch就是批量的意思

// 一次查询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已经帮你做好了这一切。

写在最后:

这些就是我在学习Yii2中总结的一些有关Active Record的改进,不得不说,Yii2的这些改进使得我们的开发更友好,更优雅了,仅是Active Record,就可以让人用的很爽,所以,上手Yii2吧

原文来自:http://www.jellybool.com/post/yii2-active-record

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/20901.html

相关文章

  • Yii2MVC新特性

    摘要:而且现在的中,每个输出变为了返回,就像上面的一样,你现在可以完全返回一个字符串了,有没有一丝丝的影子不过,你在的中只需认识这些新特性基本就足矣,因为一些更基本的东西跟是一样的撒,完全不用怕,我是说如果你上手过的话。 这篇文章主要来看看在Yii2之中的MVC,当然,最核心的思想还是跟Yii1.1一样的,但是我今天是想来看看在Yii2里的MVC跟Yii1.1有什么不同,或者应该直接说,Yi...

    sushi 评论0 收藏0
  • Yii修行之路 - Active Record 活动记录

    摘要:建立关联关系后,通过可以获取一个对象的数组,该数组代表当前客户对象的订单集。定义关联关系使用一个可以返回对象的方法,对象有关联上下文的相关信息,因此可以只查询关联数据。基于表外键定义关联关系是最佳方法。 简介 Yii 在操作数据库方面提供了一个十分强大的类库来支撑整个框架业务的运转,这就是 Active Record (活动记录,以下简称AR)。 基本概念 AR类提供了一个面向对象的接...

    HmyBmny 评论0 收藏0
  • Yii修行之路 - Extension 扩展

    摘要:运行来安装指定的扩展。这更便于用户辨别是否是的扩展。当用户运行安装一个扩展时,文件会被自动更新使之包含新扩展的信息。上述代码表明该扩展依赖于包。例如,上述的条目声明将对应于别名。为达到这个目的,你应当在公开发布前做测试。 简述 扩展是专门设计的在 Yii 应用中随时可拿来使用的, 并可重发布的软件包。 基础 例如, yiisoft/yii2-debug 扩展在你的应用的每个页面底部添加...

    bovenson 评论0 收藏0
  • 现在写 PHP,你应该知道这些

    摘要:首先你应该是在用以上的版本,如果版本在这之下,是时候该升级了。按照其官网的说法,这个组织的目的并不是告诉你你应该怎么做,只是一些主流的框架之间相互协商和约定。和没有出现在以上的列表中,是因为还没有投票通过。不要被这些话所困扰。 首先你应该是在用 PHP 5.3 以上的版本,如果 PHP 版本在这之下,是时候该升级了。我建议如果有条件,最好使用最新的版本。 你应该看过 PHP The R...

    supernavy 评论0 收藏0
  • 优雅、贴心、靠谱Node.js开发框架-AdonisJs

    摘要:关于作者程序开发人员,不拘泥于语言与技术,目前主要从事和前端开发,使用和,端使用混合式开发。合适和够用是最完美的追求。没错,是一款的后端框架。的灵感来自一个名为的框架。功能亮点是围绕实际用例构建的。让您忘掉传统查询,拥抱优雅的数据模型。 关于作者 程序开发人员,不拘泥于语言与技术,目前主要从事PHP和前端开发,使用Laravel和VueJs,App端使用Apicloud混合式开发。合...

    Michael_Ding 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<