yii2项目实战-那些年错过的数据库查询
Posted 白狼栈
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了yii2项目实战-那些年错过的数据库查询相关的知识,希望对你有一定的参考价值。
对于框架而言,与数据库交互的操作自然少不得。yii2也提供了下面几种与数据库交互的方式,先来简单了解下
1、简单粗暴的原生sql查询
2、程序化、不需要关心DBMS的sql查询
3、AR提供了数据库与模型之间的交互
关于上面三种方式,手册上介绍的都很详细,今天我们拿前面两条介绍,给划划重点,避免一些小坑。
数据库访问对象(Database Access Objects)DAO
DAO便是我们首先要介绍的,如果不依赖框架,相信大部分人都会选择使用PDO与数据库进行交互,但是写起来稍微麻烦些。DAO是什么呢?写到这里,相信一部分人都能猜到了。DAO是构建与PDO之上,让我们可以用更简单高效方便的方式进行数据库操作。
吐槽:老师你能不能说人话?
简单的说,就是在yii框架的基础之上执行原生的sql语句。
来看看如何实现:
第一步自然是进行数据库配置了,相信各位都不陌生,在刚开始学习yii2的时候都知道怎么配置了,不懂的请先
下一步我们创建 yii\db\Command 对象就可以执行sql语句了
$result = Yii::$app->db->createCommand($sql)->查询方法
常见的'查询方法'都有这些
queryAll、queryOne、queryScalar
例如,如果我们想获取article表内所有的数据(当然我们很少这样做)
$sql = "SELECT * FROM `article`"; $result = Yii::$app->db->createCommand($sql)->queryAll();
同理,queryOne()是获取一条数据,queryScalar是获取一个值
简单吧,别着急,我们来看两个小小的坑
1、queryOne方法只返回结果集中的一条数据,实际查询的条件语句中并不会带上limit 1,如果你调用该方法查询数据,但是不能保证返回的结果集只有一条,为了性能考虑,请务必添加limit 1这个条件
2、在一些接收用户提交的参数的where条件上,千万不要像下面这样直接拼接where条件
$id = $_GET['id']; $sql = "SELECT * FROM `article` WHERE id = '{$id}'"; $result = Yii::$app->db->createCommand($sql)->queryAll();
实际开发中,为了避免sql注入,请一定不要参考上面的写法!绑定参数是一种避免sql注入的友好方式,来看下正确的写法
$result = Yii::$app->db->createCommand('SELECT * FROM `article` WHERE id=:id') ->bindValue(':id', $_GET['id']) ->queryOne();
如果where条件的参数不是来自于用户端,那随便写。
查询构建器(Query Builder)
原生sql的写法很简单,但是危险性也很大,一个不小心可能就被sql注入了,这是非常危险、实际开发中一定不能发生的事情。相对于原生sql,query builder就安全的多了,而且,一旦你的sql很长,query builder构建的sql语句,可读性也会更强。这么好用的工具,快来试试吧。
步骤很简单,你只需要实例化\yii\db\Query类,然后调用查询方法即可。
$query = new \yii\db\Query; $results = $query ->select(['id', 'email']) ->from('user') ->where(['username' => 'aa']) ->limit(5) ->all();
有些人可能很疑惑,我并不知道有你上面那些方法呀?这个不难,你只需要打开\yii\db\Query类,多看上几眼该类的方法都有哪些,下回就懂如何调用了。
我们接着说上面构建的一个用法,可能很多同学要问,其执行的具体sql又是怎么样的呢?
点击左下角“阅读原文”继续阅读
以上是关于yii2项目实战-那些年错过的数据库查询的主要内容,如果未能解决你的问题,请参考以下文章