YII2.0 AcriveRecord的簡單使用

這篇文章我們來看看在 Yii2 之中的 Active Record,爲啥要將 Active Record 單獨出來說呢?因爲個人認爲這是 Yii(不管是 Yii1.1 還是 Yii2)最強大的一部分功能之一,何況又遇上在 Yii2 中其實對 Active Record的改進還是比較多的,所以我們就通過這篇文章來瞅瞅 Yii2 的 Active Record 新特性。

1、支持更多的數據庫

下面是所有目前被 Yii 的 AR 功能所支持的數據庫列表:

  • MySQL 4.1 及以上:通過 [[yii\db\ActiveRecord]]

  • PostgreSQL 7.3 及以上:通過 [[yii\db\ActiveRecord]]

  • SQLite 2 和 3:通過 [[yii\db\ActiveRecord]]

  • Microsoft SQL Server 2010 及以上:通過 [[yii\db\ActiveRecord]]

  • Oracle: 通過 [[yii\db\ActiveRecord]]

  • CUBRID 9.1 及以上:通過 [[yii\db\ActiveRecord]]

  • Sphinx:通過 [[yii\sphinx\ActiveRecord]],需求 yii2-sphinx 擴展

  • ElasticSearch:通過 [[yii\elasticsearch\ActiveRecord]],需求 yii2-elasticsearch 擴展

  • Redis 2.6.12 及以上:通過 [[yii\redis\ActiveRecord]],需求 yii2-redis 擴展

  • MongoDB 1.3.0 及以上:通過 [[yii\mongodb\ActiveRecord]],需求 yii2-mongodb 擴展

2、Active Record 的使用

    1)簡單使用

//獲取狀態正常的並且以name排序的客戶
$customer = Customer::find()->where(['status'=>1])->orderBy('name')->all();
//獲取name=gavin 的用戶
$customer = Customer::find()->where(['name'=>'gavin'])->one();
//獲取所有狀態正常的用戶
$count = Customer::find()->where(['status'=>1])->count();
//獲取特定字段的數據
$customer = Customer::find()->where(['status'=>1])->select(['name', 'nickname', 'address'])->all();
//獲取ID=1,2,3的數據
$customer = Customer::findAll(['id'=>[1,2,3]]);
//獲取特定條件的一條數據
$customer = Customer::findOne(['name'=>'gavin', 'stuats'=>1])

2)連表操作

模型:

//YII的連表操作和CAKEPHP的操作基本是一致的,都是通過hasOne  和 hasMany()關聯獲取的。
比如:我有一個News表,還有一個NewsImages表,一個news對應多條newsimages數據
<?php
namespace backend\models;
 
use  Yii;
use yii\base\Model;
use yii\base\Object;
/**
  * news class
  *
  * @author  Gavin
  * @version 1.0
 */
class News extends \yii\db\ActiveRecord
{
    /**
     * 指定數據表名稱
     *
     * @return string
     */
    public static function tableName() {
        return '`news`';
    }
    /**
     * 對news表和news_amges表進行關聯
     * news_images數據表中的news_id對應news表中的id
     *
     * @return Object
     */
    public function getNewsImages() {
        return $this->hasMany(NewsImages::className(), ['news_id'=>'id']);
    }
}
<?php
namespace backend\models;
 
use Yii;
use yii\base\Object;
/**
  * news images class
  *
  * @author  Gavin
  * @version 1.0
 */
class NewsImages extends \yii\db\ActiveRecord
{
    /**
     * 指定數據表名稱
     *
     * @return string
     */
    public static function tableName() {
        return '`news_images`';
    }
    /**
     * news image 數據與news數據相關聯
     *
     * @return Object
     */
    public function getNews() {
        return $this->hasOne(News::className(), ['id'=>'news_id']);
    }
}
控制器
<?php
namespace backend\controllers;
 
use Yii;
use yii\base\Controller;
use backend\models\News;
 
class NewsController extends Controller
{
    /**
     * 連表查詢數據
     *
     * @return void
     */
    public function actionLB() {
        $news = News::findOne(3);
        $newsImage = $news->newsImages;
        echo "<pre>";
        var_dump($news);
        var_dump($newsImage);
        die;
    }
}


備註:如果查詢的關聯表需要獲取字段,在同一個表中應該這麼寫:【獲取的特定字段一定包含關聯字段,否則無法獲取數據】 

$object = News::find()->orderBy('published_time DESC, created_time DESC');
$newsDatas = $object->select(['id', 'title', 'status', 'recommend', 'set_top', 'hot_focus', 'published_time', 'created_time'])
->offset($pages->offset)
->limit($pages->limit)
//獲取關聯表的字段
->with(['newsImages'=>function($object){$object->select('id', 'image_url');}])
->asArray()
->all();

WHERE多條件的使用              

AND

$condition = ['status'=>1, 'set_top'=>1]


如果是  or  來怎麼處理呢?

$condition = ['or', 'recommend=1', 'status=2'];

 

$condition = ['or', 'recommend=1', 'source="http://dreameng.blog.51cto.com"'];



IN

$condition = ['in''id', [1,2,3]];


LIKE

$condition = ['like''source''dreameng'];


AND  |  OR

$condition = ['and''recommend=1', ['or' ,'source="http://dreameng.blog.51cto.com"''status=1']];



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章