首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

Yii Model 層操作全攻略:屬性、方法與 AR 實戰技巧

     編輯:PHP 相關知識

Yii Model 層操作全攻略:屬性、方法與 AR 實戰技巧

Yii 的 Model 是 MVC 架構中資料邏輯的核心。本文系統整理 Model 常用屬性、生命週期方法、Active Record (AR) 操作、關聯查詢與效能優化技巧,幫助開發者掌握資料層開發精髓。

Model 核心屬性速覽

屬性/方法用途說明
tableName()指定資料表回傳字串,如 'gshop_order_ext'
rules()驗證規則定義欄位驗證邏輯
relations()關聯關係定義 BELONGS_TO、HAS_MANY 等關聯
attributeLabels()欄位標籤表單顯示友善名稱
safeAttributes()大量賦值白名單Yii 1.1 必設,Yii 2.0 改用 rules() 中 safe 驗證器
beforeValidate/afterValidate驗證前後鉤子需回傳 true 才繼續流程
beforeSave/afterSave儲存前後鉤子常用於時間戳自動填充、資料加密等

Active Record 核心操作

寫入操作

// 新增
$model = new User;
$model->name = 'John';
$model->save();        // 等同 insert()

// 修改
$model = User::model()->findByPk(1);
$model->name = 'Jane';
$model->save();        // 等同 update()

// 刪除
$model = User::model()->findByPk(1);
$model->delete();

// 驗證(不寫入資料庫)
if ($model->validate()) { /* ... */ }

讀取操作:四大查詢方法

方法參數型態回傳型態適用場景
findByPk()主鍵值 / 陣列單一 Model 實例精確查詢單筆
findByAttributes()條件陣列單一 Model 實例依非主鍵欄位查單筆
findAllByAttributes()條件陣列Model 陣列依條件查多筆
findAll()CDbCriteria 物件Model 陣列複雜查詢、分頁、排序

CDbCriteria 進階查詢實戰

$criteria = new CDbCriteria;
$criteria->condition = "title LIKE :keyword";
$criteria->params = array(':keyword' => '%php%');
$criteria->order = 'created_time DESC';
$criteria->limit = 10;
$criteria->select = 'id, title, content';  // 僅選取需要欄位,減少傳輸

$articles = Article::model()->findAll($criteria);
// $articles 為 Article 物件陣列,可直接 $article->title 存取

關聯查詢:Lazy Load vs Eager Load

Yii 預設使用 Lazy Load(延遲載入),存取關聯屬性時才發出 SQL。若在列表頁需顯示關聯資料,會產生 N+1 查詢問題。

解決方案:使用 with() 進行 Eager Load(急切載入)

// 一次查詢撈取文章與分類
$articles = Article::model()->with('category')->findAll();

// 在 view 中直接存取,不再觸發額外 SQL
foreach ($articles as $article) {
    echo $article->category->name;  // 已預載入
}

關聯定義範例

public function relations() {
    return array(
        'category' => array(self::BELONGS_TO, 'Category', 'category_id'),
        'tags'     => array(self::MANY_MANY, 'Tag', 'article_tag(article_id, tag_id)'),
        'comments' => array(self::HAS_MANY, 'Comment', 'article_id'),
    );
}

效能優化建議

  • 只選取必要欄位:使用 select 避免 SELECT *。
  • 善用索引:condition 中的欄位應建立索引。
  • 分頁查詢:搭配 CPagination 使用 limit/offset。
  • 關聯預載入:列表頁必用 with() 避免 N+1 問題。
  • 快取查詢結果:cache() 方法可快取 AR 查詢結果。

延伸閱讀

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved