yii2增删改查及AR的理解
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 事件