YII2-数据查询Active Record方法


查询数据
AR 提供了两种方法来构建 DB 查询并向 AR 实例里填充数据:
•[[yii\db\ActiveRecord::find()]]
•[[yii\db\ActiveRecord::findBySql()]]
以上两个方法都会返回 [[yii\db\ActiveQuery]] 实例,该类继承自[[yii\db\Query]], 因此,他们都支
持同一套灵活且强大的 DB 查询方法,如 where(),join(),orderBy(),等等。 下面的这些案例展示了
一些可能的玩法:
// 取回所有活跃客户(状态为 *active* 的客户)并以他们的 ID 排序:
$customers = Customer::find()
->where(['status' => Customer::STATUS_ACTIVE])
->orderBy('id')
->all();
// 返回ID为1的客户:
$customer = Customer::find()
->where(['id' => 1])
->one();
// 取回活跃客户的数量:
$count = Customer::find()
->where(['status' => Customer::STATUS_ACTIVE])
->count();
// 以客户ID索引结果集:
$customers = Customer::find()->indexBy('id')->all();
// $customers 数组以 ID 为索引
// 用原生 SQL 语句检索客户:
$sql = 'SELECT * FROM customer';
$customers = Customer::findBySql($sql)->all();
小技巧:在上面的代码中,Customer::STATUS_ACTIVE 是一个在 Custom
er 类里定义的常量。(译注:这种常量的值一般都是tinyint)相较于直接
在代码中写死字符串或数字,使用一个更有意义的常量名称是一种更好的编
程习惯。
有两个快捷方法:findOne 和 findAll() 用来返回一个或者一组ActiveRecord实例。前者返回第一个匹
配到的实例,后者返回所有。 例如:
// 返回 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,
]);
以数组形式获取数据
有时候,我们需要处理很大量的数据,这时可能需要用一个数组来存储取到的数据, 从而节省内存。你
可以用 asArray() 函数做到这一点:
// 以数组而不是对象形式取回客户信息:
$customers = Customer::find()
->asArray()
->all();
// $customers 的每个元素都是键值对数组
批量获取数据
在 Query Builder(查询构造器) 里,我们已经解释了当需要从数据库中查询大量数据时,你可以
用 batch query(批量查询)来限制内存的占用。 你可能也想在 AR 里使用相同的技巧,比如这样…

// 一次提取 10 个客户信息
foreach (Customer::find()->batch(10) as $customers) {
// $customers 是 10 个或更少的客户对象的数组
}
// 一次提取 10 个客户并一个一个地遍历处理
foreach (Customer::find()->each(10) as $customer) {
// $customer 是一个 ”Customer“ 对象
}
// 贪婪加载模式的批处理查询
foreach (Customer::find()->with('orders')->each() as $customer) {
}
操作数据
AR 提供以下方法插入、更新和删除与 AR 对象关联的那张表中的某一行:
•[[yii\db\ActiveRecord::save()|save()]]
•[[yii\db\ActiveRecord::insert()|insert()]]
•[[yii\db\ActiveRecord::update()|update()]]
•[[yii\db\ActiveRecord::delete()|delete()]]
AR 同时提供了一下静态方法,可以应用在与某 AR 类所关联的整张表上。 用这些方法的时候千万要小
心,因为他们作用于整张表! 比如,deleteAll() 会删除掉表里所有的记录。
•[[yii\db\ActiveRecord::updateCounters()|updateCounters()]]
•[[yii\db\ActiveRecord::updateAll()|updateAll()]]
•[[yii\db\ActiveRecord::updateAllCounters()|updateAllCounters()]]
•[[yii\db\ActiveRecord::deleteAll()|deleteAll()]]
下面的这些例子里,详细展现了如何使用这些方法:
// 插入新客户的记录
$customer = new Customer();
$customer->name = 'James';
$customer->email = 'james@example.com';
$customer->save(); // 等同于 $customer->insert();
// 更新现有客户记录
$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() 会更新表里的对应行记录。
数据输入与有效性验证
由于AR继承自[[yii\base\Model]],所以它同样也支持Model的数据输入、验证等特性。例如,你可以
声明一个rules方法用来覆盖掉[[yii\base\Model::rules()|rules()]]里的;你也可以给AR实例批量赋
值;你也可以通过调用[[yii\base\Model::validate()|validate()]]执行数据验证。
当你调用 save()、insert()、update() 这三个方法时,会自动调用
[[yii\base\Model::validate()|validate()]]方法。如果验证失败,数据将不会保存进数据库。
下面的例子演示了如何使用AR 获取/验证用户输入的数据并将他们保存进数据库:
// 新建一条记录
$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()) {
// 获取用户输入的数据,验证并保存

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Yii2框架的Active Record是一个强大的ORM(对象关系映射)工具,它可以将数据库中的表映射成为Yii2框架中的PHP类,并且提供了一系列的API来进行对数据库的操作。 下面是一些常用的Active Record操作: 1. 查询单条记录: ```php $model = ModelName::findOne($id); ``` 2. 查询多条记录: ```php $models = ModelName::find()->where(['attribute' => 'value'])->all(); ``` 3. 插入记录: ```php $model = new ModelName(); $model->attribute = 'value'; $model->save(); ``` 4. 更新记录: ```php $model = ModelName::findOne($id); $model->attribute = 'new value'; $model->save(); ``` 5. 删除记录: ```php $model = ModelName::findOne($id); $model->delete(); ``` 6. 自定义查询: ```php $models = ModelName::find()->select(['attribute1', 'attribute2'])->asArray()->all(); ``` 上述代码中,`ModelName`是你定义的Active Record类名,`findOne()`方法用于查找单条记录,`find()`方法用于查找多条记录,`where()`方法用于设置查询条件,`all()`方法返回所有查询结果,`new`关键字用于创建新的Active Record实例,`save()`方法用于保存数据数据库中,`delete()`方法用于删除数据,`select()`方法用于指定查询的列,`asArray()`方法用于返回查询结果数组而不是Active Record对象。 需要注意的是,Active Record还提供了一些高级的操作,如关联查询、批量操作、查询缓存等。详细的信息可以参考Yii2官方文档。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值