Yii2 的 ActiveRecord (AR) 是操作數據庫的核心層。本文串聯從資料庫配置、Gii 自動生成模型/CRUD、Migration 版本控制到日常 AR 用法的完整工作流。
config/db.phpreturn [
'class' => 'yii\db\Connection',
'dsn' => 'mysql:host=localhost;dbname=yii2basic',
'username' => 'root',
'password' => '',
'charset' => 'utf8',
// 生產環境建議開啟
'enableSchemaCache' => true,
'schemaCacheDuration' => 3600,
'schemaCache' => 'cache',
];
https://localhost/basic/web/index.php?r=giimodels/TableName.php修改表結構(加欄位、改索引、建表)一律寫 Migration,禁止手動操作生產庫。
# 創建遷移文件
./yii migrate/create "add_book_desc_column"
# 生成 migrations/m150225_022640_add_book_desc_column.php
class m150225_022640_add_book_desc_column extends Migration {
public function up() {
$this->addColumn('book', 'book_desc', $this->text());
}
public function down() {
$this->dropColumn('book', 'book_desc');
}
}
# 執行遷移
./yii migrate
# 回滾最後一條
./yii migrate/down
| 操作 | 代碼 |
|---|---|
| 查單條 | Book::findOne(10) / Book::find()->where(['id'=>10])->one() |
| 查列表 | Book::find()->where(['status'=>1])->orderBy('id DESC')->all() |
| 分頁 | new ActiveDataProvider(['query'=>Book::find(), 'pagination'=>['pageSize'=>20]]) |
| 新增 | $m=new Book; $m->title='...'; $m->save(); |
| 更新 | Book::updateAll(['status'=>0], ['id'=>5]) |
| 刪除 | Book::deleteAll(['<','id',10]) |
| 關聯急切加載 | Book::find()->with('author','categories')->all() |
| 統計 | Book::find()->count() / sum('price') |
| 事務 | \Yii::$app->db->transaction(function(){ $m1->save(); $m2->save(); }); |
// Book.php
public function getAuthor() {
return $this->hasOne(Author::className(), ['id' => 'author_id']);
}
public function getCategories() {
return $this->hasMany(Category::className(), ['id' => 'category_id'])
->viaTable('book_category', ['book_id' => 'id']);
}
rules()、屬性標籤 attributeLabels()ActiveDataProvider + GridView/ListView,支援排序、分頁、篩選零代碼with()batchInsert() 或事務包裹 insert()掌握「配置 → Gii → Migration → AR」閉環,即可在團隊協作中實現數據庫結構與代碼的同步演進,消除「線上庫跟代碼不一致」的頂級隱患。