前言:
在网站开发过程中,绝对少不了对数据库的操作,yii2框架中提供了四种对数据库的操作方法,本文将进行归纳和介绍。
https://www.cnblogs.com/chrdai/p/8006695.html(推荐文章)
一.Yii如何使用数据库
Yii通过 数据库访问对象 来使用数据库。
意思就是我们把连接的数据库映射为一个对象,这样做就把对数据库的操作变成了对 对象 的操作。
听起来有点抽象,看看下面实际的代码操作,就能慢慢体会。
二.数据库的连接
当我们配置好数据库连接文件之后,会自动创建一个yii\db\Connection对象,我们可以通过这个对象访问数据库。
使用这个数据库连接对象的写法:Yii::$app->db
图片截取自:魏曦教你学Yii2.0优酷视频.
三.数据库的查询
方法一:使用 createCommand("SQL查询语句") 方法来查询数据库。
例子1:
<?php
$a=Yii::$app->db->createCommand('SELECT * FROM post LIMIT 2 ')->queryAll();
echo "<pre>";
var_dump($a);
/*
Yii::db->createCommand()创建yii\db\Command对象,
该对象调用queryAll()方法,结果返回一个二维数组
行号是依次递增的整数,列号是表属性的名称。
*/
?>
结果:(返回的是二维字符数组)
例子2:
<?php
//数据绑定的方法
Yii::$app->db->createCommand('SELECT * from post where id=:id and status=:status')
->bindValue('id',$_GET['id']) //$_GET['id']获取url上的id
->bindValue('status',2)
->queryAll();
?>
不过这种方法来访问数据库其实并不是很常用,原因如下:
1.不同数据库系统的SQL语句会有些差别,因此无法做到代码使用于多种数据库。
想象一下当你的代码迁移的时候,大工程面对的修改量是令人发怵的。
2.用数组,而不是面对对象的方式管理数据,代码难为难维护。
3.如果不小心,会留下SQL注入这种不安全因素。
图片截取自:魏曦教你学Yii2.0优酷视频.
更多使用方法参考:https://blog.youkuaiyun.com/benben0729/article/details/82626268
方法二:
通过ActiveRecord(活动记录类)来访问数据库。
- 一个AR类关联数据库的一张表,每个AR类对象对应表中的一行。
- AR对象的属性,对应为数据库的列。
- 可以直接以面向对象的方式来操纵数据表中的数据,这样就不需要写SQL语句就能实现数据库的访问。
思路图:
数据查询:
AR提供了两种静态方法来构建DB查询,返回AR对象。
- yii\db\ActiveRecord::find()
<?php
$modl=Post::find()->where(['id'=>10])->one();
var_dump($model);
exit(0);
//Post是根据数据库中的表post建立的AR类
//one()方法执行查询,不是返会一个AR对象(一行)
//all()方法执行查询,返回的是一个AR对象数组(多行)
?>
结果:可以看到返回的是Post类的对象,一个对象对应表中的一行。
- find()公共静态方法创建了yii\ActiveQueryInterface实例,该实例去帮我们进行查询。
图片截取自:魏曦教你学Yii2.0优酷视频.
静态方法find()有两种快捷方式:
$model=Post::findOne(1); //查询主关键字为1的这条记录
$model=Post::findAll(['status'=>1,]); //参数为查询条件,可以返回多个对象,findAll()方法
//相当于把find、where、all三个方法结合到一起
方法三:
- yii\db\ActiveRecord::findBySql()
$sql="select * from post where status=1";
$posts=Post::findBySql($sql)->all();
//和createCommand()方法类似,都用到SQL语句
//但是返回的是AR对象,不再是字符型数组
//findBySql()方法返回的是yii\db\ActiveQuery对象
注:
方法一是以整个数据库为对象来操作,而方法二是以一张表对应一个AR类来操作的,
AR类是yii框架的灵魂,方法一并不常用,因为有注入式攻击的风险。
方法四:查询构建器
该方法通过创建一个yii\db\Query对象来代表一条SELECT SQL语句,然后通过一套可以串起来的方法,如select 、from方法,构建可以满足一定要求的查询条件,注意:
该方法只适合查询
该方法返回的是字符型数组
<?php
$rows=(new yii\db\Query)
->select(['id','name'])
->from('poststaus')
->where(['and','id=1','id=2'])
->all();
?>
四.继承关系和调用的类
方法四 (查询构建器):
查询构建器用yii\db\Query对象来进行查询,最后得到一个字符型二维数组。
方法二 (AR类):
AR类find方法返回的对象是:yii\db\ActiveQuery
继续调用where方法返回的还是yii\db\ActiveQuery对象,
最后调用all或者其他方法得到AR类对象;
yii\db\ActiveQuery类继承自yii\db\Query,所以AR的find方法后面也可以接select语句来进行查询;
返回的也是AR类对象数组,但是根据select['属性']的不同,返回的AR类使用上会有些区别;
虽然返回的数据是一样的,但是二者的呈现方式是不一样的。
下面两种写法,第一种返回的是AR类对象数组,第二种返回的是字符型数组;
asArray()可以把AR数组,保存成字符型数组;
<?php
$allStatus=Post::find()
->select(['id','title'])
->from('post')
->all();
//返回的AR类对象,只能使用'id'&&'name'两个属性;
$allStatus=(new yii\db\Query())
->select(['id','title'])
->from('post')
->all();
//上面两种写法效果是一样的
?>
栗子1:
<?php
$allStatus=Post::find()->all();
echo "<pre>";
var_dump($allStatus);
$allStatus=Post::find()
->select(['id','title'])
->from('post')
->all();
echo "<pre>";
var_dump($allStatus);
?>
结果分别如下:
总结图片: