1. yii\db\createCommand
优点: 简单 高效
缺点: 被sql注入风险,返回数组不是对象,不同数据库会有差别
Yii::$app->db->createCommand("select * from user where id=:id and status=:status")
->bindValue(":id", $_GET['id'])
->bindValue(":status", 2)
->queryAll();
2. yii\db\ActiveRecord
以DAO为基础
- 一个AR类关联一张数据表,每个AR对应一个表的一行
- AR对象的属性对应数据库的列
- 可直接用面向对象来操纵数据库的数据
查询方法
查询完数据填充到AR对象并返回
yii\db\ActiveRecord::find()
$model = Post::find()->where(['id' => 1])->one();
$model = Post::findOne(1);
$model = Post::find()->where(['status' => 1])->all();
$model = Post::findAll(['status'=>1]);
查询基于 ActiveQueryInterface类,里面有所有查询方法,详情见类参考手册,下列为常用
all(), one(), where(), orWhere(), andWhere(), orderBy(), andOrderBy(), count(), limit(), with()
主要关注where,详情见类参考手册,下列为常用
['add', 'id=1', 'status=1'], ['or', 'id=1', 'id=2'], ['in', 'id', [1,2,3]],
['between', 'id', 1, 10], ['like', 'id', ['text', 'sample']], ['>=', 'id' , 10]
复合查询参考案例:
$post = Post::find()->where(['and', ['status'=> 2], ['authorid' => 1], ['like','posttitle',['like','title']]])->orderBy('id')->all();
插入更新删除:
yii\db\ActiveRecord->insert();
$post = new Post(); $post->title="abc" $post->insert(); //save();
yii\db\ActiveRecord->update();
$post = Post::findOne($id); $post->title="def"; $post->update(); //save()
yii\db\ActiveRecord->delete();
$post = Post::findOne($id); $post->delete(); //save()
yii\db\ActiveRecord::findBySql()
返回对象,只是要注意sql安全,避免注入.
3. new \yii\db\Query()
查询构建器
- 基于DAO,可程序化构建
- 创建DBMS无关的SQL语句
- 更安全易读
$rows = (new \yii\db\Query())
->select(['id' , 'name'])
->from('user')
->where(['lastname' => 'Json'])
->orderBy(id)
->limit(10)
->indexBy(id)
->all();
-
构建查询
用yii\db\Query对象来代表一条SQL语句,通过select/from/where/order
等方法构建出查询条件 -
使用以下方法检索出数据
name | desc |
---|---|
all() | 返回行组成的数组,每行说名称和值组成的关联数组 |
one() | 返回结果集的第一行 |
column() | 返回结果集的第一列 |
scalar() | 返回结果集的第一行第一列的标准集 |
exists() | 返回一个表示该查询是否包含结果集的值 |
count() | 返回count()查询的结果 |
sum() | 返回指定列的和 |
average() | 返回指定列的平均值 |
max() | 返回指定列的最大值 |
min() | 返回指定列的最小值 |
4. 数据提供者 dataProvider
- 获取数据提供给其他组件或页面
- 可对数据进行分页和排序
- 实现了
\yii\data\DataProviderInterface
接口
- 类型
- ActiveDataProvider
- SqlDataProvider
- ArrayDataProvider
- 自定义
- 用pagination定义分页条数 [‘pageSize’ => 10]
- 用sort进行排序字段和方式
sort => [
'defaultOrder' => ['id' => SORT_DESC],
'attribute' => ['id','title']
]
- 常用方法
- getPagination()
- getSort()
- getCount()
- getTotalCount()
- getModels()
3种查询对比
查询方式 | 构建查询 | 返回值 |
---|---|---|
command 方法 | SQL语句 | 数组 |
AR 的findBySql 方法 | SQL语句 | 对象 |
Query对象 | 查询构建器 | 数组 |
AR的find方法 | 查询构建器 | 对象 |