Yii2 - Active Record 輕鬆學習

ruiyuan發表於2019-07-31
  • 繼承 \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()後,可以用很多查詢方法
  • 用屬性查,除第一次,後面的都是差的快取;用方法的話每次都得查詢,並且對伺服器的壓力大一些

相關文章