Yii2数据库操作总结

本文详细介绍了Yii框架中三种数据库操作方法:createCommand、ActiveRecord和Query的使用技巧及注意事项,对比了它们的优缺点,包括SQL构建、数据查询、插入更新删除及数据提供者等关键功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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为基础

  1. 一个AR类关联一张数据表,每个AR对应一个表的一行
  2. AR对象的属性对应数据库的列
  3. 可直接用面向对象来操纵数据库的数据

查询方法

查询完数据填充到AR对象并返回

  1. 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()

  1. 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();
  1. 构建查询
    用yii\db\Query对象来代表一条SQL语句,通过select/from/where/order等方法构建出查询条件

  2. 使用以下方法检索出数据

namedesc
all()返回行组成的数组,每行说名称和值组成的关联数组
one()返回结果集的第一行
column()返回结果集的第一列
scalar()返回结果集的第一行第一列的标准集
exists()返回一个表示该查询是否包含结果集的值
count()返回count()查询的结果
sum()返回指定列的和
average()返回指定列的平均值
max()返回指定列的最大值
min()返回指定列的最小值

4. 数据提供者 dataProvider

  • 获取数据提供给其他组件或页面
  • 可对数据进行分页和排序
  • 实现了 \yii\data\DataProviderInterface 接口
  1. 类型
  • ActiveDataProvider
  • SqlDataProvider
  • ArrayDataProvider
  1. 自定义
  • 用pagination定义分页条数 [‘pageSize’ => 10]
  • 用sort进行排序字段和方式
sort => [
    'defaultOrder' => ['id' => SORT_DESC],
    'attribute' => ['id','title']
]
  1. 常用方法
  • getPagination()
  • getSort()
  • getCount()
  • getTotalCount()
  • getModels()

3种查询对比

查询方式构建查询返回值
command 方法SQL语句数组
AR 的findBySql 方法SQL语句对象
Query对象查询构建器数组
AR的find方法查询构建器对象
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值