這篇文章我們來看看在 Yii2 之中的 Active Record,爲啥要將 Active Record 單獨出來說呢?因爲個人認爲這是 Yii(不管是 Yii1.1 還是 Yii2)最強大的一部分功能之一,何況又遇上在 Yii2 中其實對 Active Record的改進還是比較多的,所以我們就通過這篇文章來瞅瞅 Yii2 的 Active Record 新特性。
1、支持更多的數據庫
下面是所有目前被 Yii 的 AR 功能所支持的數據庫列表:
|
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
如果是 or 來怎麼處理呢? $condition = ['or', 'recommend=1', 'status=2'];
$condition = ['or', 'recommend=1', 'source="http://dreameng.blog.51cto.com"']; IN
LIKE
|