yii2增刪改查
// 返回 id 為 1 的客戶 $customer = Customer::findOne(1);
// 返回 id 為 1 且狀態為 *active* 的客戶 $customer = Customer::findOne([ 'id' => 1, 'status' => Customer::STATUS_ACTIVE, ]);
// 返回id為1、2、3的一組客戶 $customers = Customer::findAll([1, 2, 3]);
// 返回所有狀態為 "deleted" 的客戶 $customer = Customer::findAll([ 'status' => Customer::STATUS_DELETED, ]);
// 插入新客戶的記錄 $customer = new Customer(); $customer->name = 'James'; $customer->email = 'james@example.com'; $customer->save();
// 等同於 $customer->insert();
$id = $model->attributes['id'];
Yii::$app->db->getLastInsertID()
// 更新現有客戶記錄 $customer = Customer::findOne($id); $customer->email = 'james@example.com'; $customer->save();
// 等同於 $customer->update();
// 刪除已有客戶記錄 $customer = Customer::findOne($id); $customer->delete();
// 刪除多個年齡大於20,性別為男(Male)的客戶記錄 Customer::deleteAll('age > :age AND gender = :gender', [':age' => 20, ':gender' => 'M']); // 所有客戶的age(年齡)字段加1: Customer::updateAllCounters(['age' => 1]);
須知:save()
方法會調用 insert()
和 update()
中的一個, 用哪個取決於當前 AR 對象是不是新對象(在函數內部,他會檢查 yii\db\ActiveRecord::isNewRecord 的值)。
若 AR 對象是由 new
操作符 初始化出來的,save()
方法會在表里插入一條數據; 如果一個 AR 是由 find()
方法獲取來的, 則 save()
會更新表里的對應行記錄。
// 新建一條記錄 $model = new Customer; if ($model->load(Yii::$app->request->post()) && $model->save()) { // 獲取用戶輸入的數據,驗證並保存 } // 更新主鍵為$id的AR $model = Customer::findOne($id); if ($model === null) { throw new NotFoundHttpException; } if ($model->load(Yii::$app->request->post()) && $model->save()) { // 獲取用戶輸入的數據,驗證並保存 }
對AR的理解
AR的生命周期
理解AR的生命周期對於你操作數據庫非常重要。生命周期通常都會有些典型的事件存在。對於開發AR的behaviors來說非常有用。
當你實例化一個新的AR對象時,我們將獲得如下的生命周期:
-
constructor
-
yii\db\ActiveRecord::init(): 會觸發一個 yii\db\ActiveRecord::EVENT_INIT 事件
當你通過 find() 方法查詢數據時,每個AR實例都將有以下生命周期:
-
constructor
-
yii\db\ActiveRecord::init(): 會觸發一個 yii\db\ActiveRecord::EVENT_INIT 事件
-
yii\db\ActiveRecord::afterFind(): 會觸發一個 yii\db\ActiveRecord::EVENT_AFTER_FIND 事件
當通過 yii\db\ActiveRecord::save() 方法寫入或者更新數據時, 我們將獲得如下生命周期:
-
yii\db\ActiveRecord::beforeValidate(): 會觸發一個 yii\db\ActiveRecord::EVENT_BEFORE_VALIDATE 事件
-
yii\db\ActiveRecord::afterValidate(): 會觸發一個 yii\db\ActiveRecord::EVENT_AFTER_VALIDATE 事件
-
yii\db\ActiveRecord::beforeSave(): 會觸發一個 yii\db\ActiveRecord::EVENT_BEFORE_INSERT 或 yii\db\ActiveRecord::EVENT_BEFORE_UPDATE 事件
-
執行實際的數據寫入或更新
-
yii\db\ActiveRecord::afterSave(): 會觸發一個 yii\db\ActiveRecord::EVENT_AFTER_INSERT 或 yii\db\ActiveRecord::EVENT_AFTER_UPDATE 事件
最后,當調用 delete() 刪除數據時, 我們將獲得如下生命周期:
-
yii\db\ActiveRecord::beforeDelete(): 會觸發一個 yii\db\ActiveRecord::EVENT_BEFORE_DELETE 事件
-
執行實際的數據刪除
-
yii\db\ActiveRecord::afterDelete(): 會觸發一個 yii\db\ActiveRecord::EVENT_AFTER_DELETE 事件