Yii2 優雅的 Active Record

這篇文章咱們來看看在 Yii2 之中的 Active Record,爲啥要將 Active Record 單獨出來講呢?由於我的認爲這是 Yii(不論是 Yii1.1 仍是 Yii2)最強大的一部分功能之一,況且又趕上在 Yii2 中其實對 Active Record的改進仍是比較多的,因此咱們就經過這篇文章來瞅瞅 Yii2 的 Active Record 新特性。php

1.支持更多的數據庫

Yii2的Active Record首先值得稱道的一點就是它已經能夠支持更多的數據庫,包括一些NoSQL類型的數據庫如MongoDB,還有一些流行的存儲後端如: elasticsearch, redis, Sphinx search也獲得很好的支持,如今真是隨意你怎麼玩數據了。由於咱們在想換一個存儲後端的時候能夠輕鬆地在配置文件裏切換過來,徹底不用去修改Active Record的代碼,酷斃!redis

2.在Yii2中使用Active Record查詢數據

在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,
    ]);

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()這個函數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

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

相關文章
相關標籤/搜索