Yii2.0框架数据库查询总结

基础查询

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
User::find()->all();    // 返回所有数据;

User::findOne($id); // 返回 主键 id 为定值 的一条数据;

User::find()->select(['id', 'name'])->one(); // 返回 字段为id和name 的一条数据;
User::find()->select('id,name')->one(); // 返回 字段为id和name 的一条数据;

User::find()->select(['id', 'name'])->all(); // 返回 字段为id和name 的所有数据;

User::find()->where(['age' => '18'])->one(); // 返回 ['age' => '18'] 的一条数据;
User::find()->where(['=', 'age', '18'])->one(); // 返回 ['age' => '18'] 的一条数据;

User::find()->where(['age' => '18'])->all(); // 返回 ['age' => '18'] 的所有数据;

User::find()->where(['in', 'age', ['18', '19']])->all(); // 返回 age 在18和19 的所有数据;
User::find()->where(['age'=>['18', '19']])->all(); // 返回 age 在18和19 的所有数据;

User::find()->orderBy('id DESC')->all(); // 排序查询, DESC:降序,ASC:升序;

User::find()->groupBy('type')->all(); // 根据 type 分组查询 的所有数据;

User::findBySql('SELECT * FROM user')->all(); // 用 sql 语句查询 user 表里面的所有数据;

User::findBySql('SELECT * FROM user')->one(); // 用 sql 语句查询 user 表里面的一条数据;

User::find()->andWhere(['sex' => '男', 'age' => '24'])->count('id'); // 统计符合条件的总条数;

User::find()->andFilterWhere(['like', 'name', '腾哥'])->all(); // 用 like 查询数据,生成 name LIKE '%腾哥%'

User::find()->andFilterWhere(['like', 'name', '%腾哥', false])->all(); // 用 like 查询数据,生成 name LIKE '%腾哥'

User::find()->andFilterWhere(['like', 'name', '腾哥%', false])->all(); // 用 like 查询数据,生成 name LIKE '腾哥%'

User::find()->one(); // 返回一条数据;

User::find()->count(); // 返回记录的数量;

User::find()->average(); // 返回指定列的平均值;

User::find()->min(); // 返回指定列的最小值 ;

User::find()->max(); // 返回指定列的最大值 ;

User::find()->scalar(); // 返回值的第一行第一列的查询结果;

User::find()->column(); // 返回查询结果中的第一列的值;

User::find()->exists(); // 返回一个值指示是否包含查询结果的数据行;

User::find()->batch(10); // 每次取 10 条数据

User::find()->each(10); // 每次取 10 条数据, 迭代查询

User::find()->indexBy('id')->asArray()->all(); // 返回所有数据数组并以ID字段为数组索引,其中ID必须是所查询的字段;

直接查询

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
/*createCommand(执行原生的SQL语句) */
$sql = "SELECT u.account,i.* FROM user as u left join user_info as i on u.id=i.user_id";
$rows = Yii::$app->db->createCommand($sql)->query();
// 查询返回多行:
$command = Yii::$app->db->createCommand('SELECT * FROM post');
$posts = $command->queryAll();

// 返回单行
$command = Yii::$app->db->createCommand('SELECT * FROM post WHERE id=1');
$post = $command->queryOne();

// 查询多行单值:
$command = Yii::$app->db->createCommand('SELECT title FROM post');
$titles = $command->queryColumn();

// 查询标量值/计算值:
$command = Yii::$app->db->createCommand('SELECT COUNT(*) FROM post');
$postCount = $command->queryScalar();

参数绑定

1
2
3
4
5
6
7
8
9
10
11
12
$post = Yii::$app->db->createCommand('SELECT * FROM post WHERE id=:id AND status=:status')
->bindValue(':id', $_GET['id'])
->bindValue(':status', 1)
->queryOne();

$params = [':id' => $_GET['id'], ':status' => 1];

$post = Yii::$app->db->createCommand('SELECT * FROM post WHERE id=:id AND status=:status')
->bindValues($params)
->queryOne();

$post = Yii::$app->db->createCommand('SELECT * FROM post WHERE id=:id AND status=:status', $params)

执行非查询语句

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
// INSERT (table name, column values)
Yii::$app->db->createCommand()->insert('user', [
'name' => 'Sam',
'age' => 30,
])->execute();

// UPDATE (table name, column values, condition)
Yii::$app->db->createCommand()->update('user', ['status' => 1], 'age > 30')->execute();

// DELETE (table name, condition)
Yii::$app->db->createCommand()->delete('user', 'status = 0')->execute();

// table name, column names, column values
Yii::$app->db->createCommand()->batchInsert('user', ['name', 'age'], [
['Tom', 30],
['Jane', 20],
['Linda', 25],
])->execute();

执行事务

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
$db = Yii::$app->db;
$transaction = $db->beginTransaction();

try {
$db->createCommand($sql1)->execute();
$db->createCommand($sql2)->execute();
// ... executing other SQL statements ...

$transaction->commit();

} catch(\Exception $e) {

$transaction->rollBack();

throw $e;
}

关联查询

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
/**
* 客户表Model:CustomerModel
* 订单表Model:OrdersModel
* 国家表Model:CountrysModel
* 首先要建立表与表之间的关系
* 在CustomerModel中添加与订单的关系
*/
Class CustomerModel extends \yii\db\ActiveRecord
{
...
//客户和订单是一对多的关系所以用hasMany
//此处OrdersModel在CustomerModel顶部别忘了加对应的命名空间
//id对应的是OrdersModel的id字段,order_id对应CustomerModel的order_id字段
public function getOrders()
{
return $this->hasMany(OrdersModel::className(), ['id'=>'order_id']);
}

//客户和国家是一对一的关系所以用hasOne
public function getCountry()
{
return $this->hasOne(CountrysModel::className(), ['id'=>'Country_id']);
}
....
}

// 查询客户与他们的订单和国家
CustomerModel::find()->with('orders', 'country')->all();
// 查询客户与他们的订单和订单的发货地址(注:orders 与 address都是关联关系)
CustomerModel::find()->with('orders.address')->all();
// 查询客户与他们的国家和状态为1的订单
CustomerModel::find()->with([
'orders' => function ($query) {
$query->andWhere('status = 1');
},
'country',
])->all();

查询条件不等于null or 不能等空

1
2
3
4
5
6
7
8
$user = User::find()
->where(['age' => $age])
->andFilterWhere([
'OR',
['NOT', 'avatar=""'],
['NOT', ['avatar' => null]]
])
->one();

查询条件等于null or 等空

1
2
3
4
5
6
7
8
$user = User::find()
->where(['age' => $age])
->andFilterWhere([
'OR',
['=', 'avatar', ''],
['IS', 'avatar', new \yii\db\Expression('NULL')]
])
->one();
坚持原创技术分享,您的支持将鼓励我继续创作!
0%