- 繼承 \yii\db\ActiveRecord
- 自動生成後至少會有三個方法tableName, rules,
attributeLabels - 資料庫的操作小助手(操作的主要是屬性和方法)
- ActiveRecord中有個方法:getDb
例子:User::find()->where([])->one();find()方法發生了什麼,batch&each大資料查詢優化
- var_dump(User::find()):【是個AR物件】返回的是yii\db\ActiveQuery這個物件;User::find()等價於ActiveQuery一個物件;ActiveQuery繼承於yii\db\Query,所以能用where等方法
- 大資料優化查詢,one方法最好也填上個limit方法
- 在model中什麼是屬性:業務資料
- 獲取所有屬性:attributes獲取所有欄位名稱及其值&attributes()只是獲取欄位名稱
- 獲取舊的資料getOldAttributes():第一次讀時的資料
- 屬性標籤:attributeLabels是,getAttributeLabel,generateAttributeLabel
- 在rules中 on設定場景,safe代表安全
- rules規則
- 塊賦值,rules裡的資料都可以:
$model->attributes = [ 'username' => 123, 'password' => 234, ]
- save如何做到insert&update兩個操作:$this->getIsNewRecord()變數來區分
- save操作如何跳過資料驗證:save(false)
- 塊賦值問題
- 更新計數問題updateCounts
- 獲取髒屬性:$model->getDirtyAttributes()
- 載入預設值:$model->loadDefaultValues()
- Goods::updateAll(['key'=>'val'],[]);
- Goods::updateAllCounters()更新計數
- Goods::deleteAll()
- 只針對AR物件 new
- 延遲載入:第一次查詢完會快取起來
- 即時載入:
$orders = Order::find()->all(); foreach($orders as $order){ $og = $order->orderGoods;(關聯)迴圈裡面會有很多查詢,查詢次數很多 } 解決方案: $orders = Order::find()->with('orderGoods')->all(); foreach($orders as $order){ $og = $order->orderGoods;(關聯) } 這樣只會有兩條查詢,第二條會是in()這種方式來解決
-
city表和user表關聯
第一種: $data = City::find() ->leftJoin("user",'city'.id = 'user'.city_id) ->with('user'):即時載入 ->asArray() ->all() 第二種: $data = City::find() ->joinWith('user') ->asArray() ->all()
- 減少sql查詢的冗餘
- inverseOf
- set和get
- 獲取屬性的關聯:$model->admins,獲得的是一個AR物件
- 通過方法的形式呼叫關聯:$model->getadmins(),獲得是ActiveQuery,AQ是個查詢集合,裡面有很多查詢構造器的方法;這就是為什麼一個$model::find()後,可以用很多查詢方法
- 用屬性查,除第一次,後面的都是差的快取;用方法的話每次都得查詢,並且對伺服器的壓力大一些