目录
4.关联查询: 假设User模型有一个名为orders的多对一关联关系。
?10.使用ActiveQuery类提供的各种方法来构建复杂的查询
Yii2是一个功能丰富的PHP框架,提供了大量的数据库查询方法和功能,以便开发人员能够方便地对数据库进行操作。以下是Yii2中一些常用的数据库查询方法的总结:
这些示例假设你已经有了一个名为User的模型,它代表了数据库中的user表,并且该表有id、username、email和status字段。
// 查找ID为1的用户
$user = User::findOne(1);
// 查找所有状态为'active'的用户
$users = User::findAll(['status' => 'active']);
// 查找状态为'active'的用户
$users = User::find()->where(['status' => 'active'])->all();
// 获取用户及其订单信息
$users = User::find()->with('orders')->all();
// 按照用户名升序排序
$users = User::find()->orderBy('username ASC')->all();
// 按照状态分组
$users = User::find()->groupBy('status')->all();
// 插入新用户
$newUser = new User();
$newUser->username = 'newuser';
$newUser->email = 'newuser@example.com';
$newUser->status = 'active';
$newUser->save(); // 或者 $newUser->insert();
// 更新用户
$user = User::findOne(1);
$user->username = 'updateduser';
$user->save(); // 或者 $user->update();
// 删除用户
$user = User::findOne(1);
$user->delete();
// 开始事务
$transaction = Yii::$app->db->beginTransaction();
try {
// 执行一系列数据库操作...
$user->save();
// 其他操作...
// 提交事务
$transaction->commit();
} catch (\Exception $e) {
// 回滚事务
$transaction->rollBack();
// 处理异常...
}
// 执行原生SQL命令
$command = Yii::$app->db->createCommand('SELECT * FROM user WHERE status = :status', [':status' => 'active']);
$users = $command->queryAll();
// count
// 假设有一个名为Post的模型类,代表博客文章
// Post是ActiveRecord的一个实例
$query = Post::find(); // 创建一个查询实例
// 统计所有文章的数量
$count = $query->count(); // 返回文章的总数
// 你也可以将统计结果作为数组的一部分返回
$ posts = Post::find()->count();
// 如果要统计带有特定条件的文章数量
$count = Post::find()->where(['status' => 'published'])->count(); // 只统计发布状态的文章
// 你也可以链式调用其他查询方法
$count = Post::find()->where(['status' => 'published'])->limit(10)->count(); // 统计最近10篇发布状态的文章的数量
// sum
// 以下是一个示例,展示了如何使用 yii\db\Query 类执行 sum 查询:
use yii\db\Query;
// 创建一个 Query 对象
$query = new Query();
// 选择要查询的表
$query->from('your_table_name');
// 使用 sum() 函数计算某个字段的总和
$sum = $query->sum('your_field_name');
// 执行查询并获取结果
$result = $query->one();
//还可以使用 select() 方法来指定要查询的字段,例如:
use yii\db\Query;
$query = new Query();
// 选择要查询的表
$query->from('your_table_name');
// 使用 sum() 函数计算某个字段的总和
$query->select(['sum(your_field_name)']);
// 执行查询并获取结果
$result = $query->scalar();
// 使用比较操作符
$query = Post::find()->where(['status' => 'published'])->andWhere(['created_at' => '<', new \DateTime()]); // 查找发布状态的文章,且创建时间早于当前时间的文章
// 使用范围查询
$query = Post::find()->where(['status' => 'published'])->andWhere(['created_at' => BETWEEN, [new \DateTime('2023-01-01'), new \DateTime('2023-12-31')]]); // 查找发布状态的文章,且创建时间在2023年1月1日至2023年12月31日之间的文章
// 你也可以直接使用范围查询的简写形式
$query = Post::find()->where(['status' => 'published'])->andWhere(['created_at' => 'BETWEEN', [new \DateTime('2023-01-01'), new \DateTime('2023-12-31')]]); // 同上,使用BETWEEN进行范围查询
// 你可以使用链式调用来组合多个条件
$query = Post::find()->where(['status' => 'published'])->andWhere(['created_at' => '<', new \DateTime()])->orWhere(['created_at' => BETWEEN, [new \DateTime('2023-01-01'), new \DateTime('2023-12-31')]]); // 查找发布状态的文章,且创建时间早于当前时间,或者创建时间在2023年1月1日至2023年12月31日之间的文章
// 你还可以使用`notBetween`来查询不在指定范围内的数据
$query = Post::find()->where(['status' => 'published'])->andWhere(['created_at' => 'NOT BETWEEN', [new \DateTime('2023-01-01'), new \DateTime('2023-12-31')]]); // 查找发布状态的文章,且创建时间不在2023年1月1日至2023年12月31日之间的文章
Post::find()->where(['in', 'uid', $arr])->andWhere(['not in', 'order_status', [-1, 2]])->groupBy('uid')->count();
Post::find()->where(['type' => '1'])->andWhere(['between', 'updated_at', $curMonth, $nexMonth])->sum('price');
Post::find()->select('id, nickname, mobile, money, status, created_at')
->where(['uid' => $this->uid])
->andWhere(['>', 'created_at', $data['startTime']-(3600*24*2)])
->andWhere(['<=', 'created_at', $data['startTime']-(3600*24)])
->orderBy('created_at desc')
->asArray()->one();
请注意,这些示例中的User模型应当是一个已经定义好的模型类,它继承了yii\db\ActiveRecord。在实际应用中,你可能需要根据具体的表结构和业务逻辑来调整这些示例代码。此外,Yii2的数据库操作通常会结合其 ActiveForm 和 GridView 等组件来提高开发效率。