Yii 2 提供 ActiveRecord(模型)、Query Builder、DAO 三層封裝。本文匯總最常用的增刪改查寫法,適合作為開發速查表。
// 方式一:實例化 + save()
$user = new User();
$user->username = 'phpernote';
$user->password = '123456';
$user->save(); // 返回 bool
// 方式二:create() 靜態方法(批量賦值需 $fillable)
User::create([
'username' => 'phpernote',
'password' => '123456',
]);
// 方式三:insert() 明確插入(不觸發驗證/事件)
$user = new User();
$user->username = 'phpernote';
$user->insert();
// 方式一:查詢後修改 + save()
$user = User::findOne(1);
$user->username = 'admin';
$user->save();
// 方式二:updateAll() 條件批量更新
User::updateAll(['username' => 'admin'], 'id = 1');
// 方式三:updateCounters() 數值字段原子增減
User::updateCounters(['login_count' => 1], 'id = 1'); // +1
User::updateCounters(['login_count' => -1], 'id = 1'); // -1
// 方式一:模型實例 delete()
$user = User::findOne(1);
$user->delete();
// 方式二:deleteAll() 條件批量刪除
User::deleteAll('id IN (1,2,3)');
// 方式三:deleteByPk() 主鍵刪除(單個或數組)
User::deleteByPk(1);
User::deleteByPk([1, 2, 3]);
User::findOne(1); // 主鍵查單條
User::find()->where(['status' => 1])->all(); // 條件查多條
User::find()->where(['status' => 1])->one(); // 條件查單條
User::find()->count(); // 計數
User::find()->select(['id', 'username'])->column(); // 單列數組
use yii\db\Query;
$rows = (new Query())
->select(['id', 'username'])
->from('user')
->where(['status' => 1])
->orderBy('id DESC')
->limit(10)
->all();
$count = (new Query())->from('user')->where(['status' => 1])->count();
$cmd = Yii::$app->db->createCommand();
// 查詢
$rows = $cmd->queryAll('SELECT * FROM user WHERE status=1');
$row = $cmd->queryOne('SELECT * FROM user WHERE id=1');
$col = $cmd->queryColumn('SELECT username FROM user');
$scalar = $cmd->queryScalar('SELECT COUNT(*) FROM user');
// 寫入
$cmd->insert('user', ['username' => 'test', 'password' => '123'])->execute();
$cmd->update('user', ['username' => 'new'], 'id=1')->execute();
$cmd->delete('user', 'id=1')->execute();
// 事務
Yii::$app->db->transaction(function ($db) {
$db->createCommand()->insert('user', ['username' => 'a'])->execute();
$db->createCommand()->insert('user', ['username' => 'b'])->execute();
});
| 特性 | ActiveRecord | Query Builder | DAO |
|---|---|---|---|
| 易用性 | 最高 | 中 | 低 |
| 性能 | 較低(事件/驗證) | 高 | 最高 |
| 關聯查詢 | 原生支援 | 手寫 JOIN | 手寫 SQL |
| 批量操作 | updateAll/deleteAll | 批量構建 | 批量 SQL |
| 適用場景 | 業務邏輯層 | 複雜報表/統計 | 底層優化/遷移 |
Yii::$app->db->createCommand()->batchInsert('user', ['username', 'password'], $data)->execute()User::findOne(1, ['lock' => true])(SELECT ... FOR UPDATE)version 字段,optimisticLock() 返回字段名。db 組件的 slaveConfig,Yii::$app->db->slave 獲取從庫連接。