yii框架学习之---数据库的使用

本文介绍了Yii2框架中数据库的使用,包括数据库连接、查询方法,如createCommand、ActiveRecord、findBySql和查询构建器。强调了ActiveRecord作为框架灵魂的重要性,并提醒了SQL注入的安全风险。

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

前言:

在网站开发过程中,绝对少不了对数据库的操作,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);
?>

结果分别如下: 

 

总结图片:

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值