Yii如何使用数据库
1.Yii如何使用数据库
Yii通过数据库访问对象(Database Access Objects,简称DAO)来使用数据库的。
DAO建立在“PHP数据对象(PDO)之上,并提供一套面向对象的API来访问数据库”
2.数据库的连接
数据库的连接通常放在配置文件中,/common/config/main-local.php中。
'db' => [
'class' => 'yii\db\Connection',
'dsn' => 'mysql:host=localhost;dbname=yii2advanced',
'username' => 'root',
'password' => 'root',
'charset' => 'utf8',
],
这里表示会创建一个yii\db\Connection对象,并用这个对象访问数据库。
这个数据库连接对象的写法:Yii->$app->db
连接不同数据库的语句略微有些差异。
3,数据库查询(yii\db\Command)
用SQL查询语句来创建一个yii\db\Command的对象,调用对象的方法来执行SQL查询,返回值是字符型的数组。
$post = Yii::$app->db->createCommand('SELECT * FROM post')->queryAll();
SQL语句还可以绑定参数。
$post = Yii::$app->db->createCommand('SELECT * FROM post WHERE id=:id AND status=:status')
->bindValue(':id',$_GET['id'])
->bindValue(':status',2)
->queryOne();
4,yii\db\Command的优缺点
1,简单,只需要处理sql语句和数组就行了(优点)
2,高效,通过sql语句来查询数据库非常高效。(优点)
----------------------------------------------------------
1,不同的数据库系统的sql语句会有些差别,因此无法做到代码适用于多种数据库系统。(缺点)
2,用数组,而没有用到面向对象的方式来管理数据,代码难维护。(缺点)
3,如果不小心,会留下SQL注入这种不安全因素。(缺点)
5,ActiveRecord
(1)
ActiveRecord(活动记录,简称AR类)提供了一项面向对象的接口,可以访问数据库中的数据。
一个AR类关联一张数据表,每个AR对象对应表中的一行
AR对象的属性,对应数据库的列
可以直接以面向对象的方式来操纵数据库中的数据(AR把数据库和模型建立的联系),这样就不需要写SQL语句就能实现数据库的访问了。
(2)声明ActiveRecord类
通过继承yii\db\ActiveRecord基类来声明一个AR类,并实现tableName方法,返回与之相关联的数据表的名称
class Post extends \yii\db\ActiveRecord
{
/**
* @inheritdoc
*/
public static function tableName()
{
return 'post';
}
AR提供了两种方法来构建DB查询,返回AR对象。
yii\db\ActiveRecord::find()
$model = Post::find()->where(['id' => 1])->one();
$model = Post::find()->where([status" => 1])->all();
这两个方法的简便替换方法是:
$model = Post::findOne(1)
$models = Post::findAll(['status' => 1])
(3)更为复杂的查询就得求助于类参考手册了。通过查询,得到复杂的查询需要借助ActiveQueryInterface这个接口。
ActiveQueryInterface的常用方法:
举例说明:
$post = Post::find()->where(['AND',['status' => 2],['author_id => 1'],['like',"title",'yii2']])->orderBy('id')->all();
此外可以通过 yii\db\ActiveRecord::findBySql()来进行数据查询,不常用。
$sql = 'SELECT * FROM post where status=1';
$posts = Post::findBySql($sql)->all();
(4)访问列数据
AR对象的属性,对应为数据行的列
$model = Post::findOne(1);
echo $model->id;
echo $model->title;
------------------------
$model = Post::findAll(['status' => 1]);
foreach($model as $item)
{
echo $item->id;
echo $item->title;
}
(5)操作数据CRUD
AR提供下边这些方法来实现插入,更新和删除等功能
yii\db\ActiveRecord::insert()
yii\db\ActiveRecord::update()
yii\db\ActiveRecord::delete()
yii\db\ActiveRecord::save()
(6)AR查询关联数据
ActiveRecord类通过hasOne或者hasMany方法来建立两张表的关联关系。
hasOne用于多对一,一对一的情况;hasMany用于一对多的情况
建立关联关系后,就可以像访问自己的类数据一样便捷地去访问关联表数据。
Gii会根据数据库表之间的关联关系,自动生成建立类之间关联关系的代码。
例如:
$thePost->status0->name
$thePost->comments
-----------------------------------------
public function getStatus0()
{
return $this->hasOne(Poststatus::className(),['id' => 'status']);
}
-------------------------------------------------
public function getComments()
{
return $this->hasMany(Comment::className(),['post_id' => 'id'])
}
6,查询构建器QueryBuilder
1,什么是查询构建器
查询构建器也是建立在DAO基础之上的,可让你创建程序化的,DBMS无关的SQL语句,并且,这样创建的SQL语句,比原生的SQL语句更加易读。更安全。
2,使用查询构建器的步骤
(1)构建查询:创建一个yii\db\Query对象来代表一条SELECT SQL语句,然后通过调用一套可以串起来的方法,比如select方法,from方法,where方法等这些方法,构建出可以满足一定要求的查询条件。
(2)执行查询。执行yii\db\Query的一个查询方法从数据库当中检索数据。例如:all(),one(),column()等这些查询方法。
$allStatus = (new \yii\db\Query())
->select(['name','id'])
->from('poststatus')
->indexBy('id')
->column();
总结:
Yii如何使用数据库的更多相关文章
- Yii 框架里数据库操作详解-[增加、查询、更新、删除的方法 'AR模式']
public function getMinLimit () { $sql = "..."; $result = yii::app()->db-& ...
- 配置yii访问远程数据库
1.将hdp002的数据库放到hdp004后,发现yii出现找不到表messages的迹象.用hdp002远程登录hdp004后发现,原来是hdp004没有授权给hdp002,用下面的sql语句即可: ...
- Yii框架 多数据库、主从、读写分离
Yii是可以在配置文件里声明多个数据库连接,然后通过Yii::app()->db1,Yii::app()->db2...来访问它们,并且也实现了更高级(自动)的主从数据库功能. 最近因为一 ...
- Yii 2.0 数据库操作总结
1. 概述 操作数据库有2种方式: DAO(data access object),不安全 ORM(onject relational mapping) 2. DAO Yii::app()->d ...
- Yii框架操作数据库的几种方式与mysql_escape_string
一.Yii操作数据库的几种选择 1,PDO方式. $sql = "";//原生态sql语句 xx::model()->dbConnection->createComma ...
- Yii中的数据库事务的使用方法小结
在项目中遇到批量删除的地方一般会使用到事务,下面列举一个用法实例与大家分享. 查看代码 打印 01 <?php 02 $array=array( 03 0=>array('us ...
- sql这两个表和查询的组合yii通过使用数据库查询
sql两个表的组合查询 使用 join on 比如:两个表查询: select u.username, t.title from user u join task t on u.id = t.id; ...
- CSRF token 无法被验证. ----Yii连接数据库后数据库错误日志报错
CSRF token 无法被验证. 我使用的是mongodb+ yii1.1 What is CSRF, please see the details here. http://en.wikiped ...
- Yii MySQL修改数据库的数据
最新学习Yii框架,分享一些学习心得,适合初学者,大神请按ctrl + w //第一种方法 <?php /* * $id 代表主键,可以是一个也可以是一个集合. * $attributes 代表 ...
随机推荐
- Centos7-卸载自带的jdk 安装jdk8
卸载JDK Centos7一般都会带有自己的openjdk,我们一般都回用oracle的jdk,所以要卸载 步骤一:查询系统是否以安装jdk #rpm -qa|grep java 或 #rpm ...
- 捕获arm托管磁盘虚拟机,并进行还原
背景:托管磁盘虚拟机"hlmma69n2",附加了一块100GB的数据磁盘.可以通过Portal管理界面直接捕获该虚拟机并进行还原,详情见如下步骤: 1.在虚拟机内部执行一般化的操 ...
- AI_深度学习概论
什么是是神经网络? 假如有6间房屋的数据集,已知房子的面积,单位是平方米或平方英尺,已知房子的价格.如果通过这6间房子的价格和房子的面积,预测房子的价格,首先要建立起一个数据模型 ,x轴为价格,y轴为 ...
- Servlet--HttpServletRequest接口,HttpServletResponse接口
HttpServletRequest接口 定义 public interface HttpServletRequest extends ServletRequest; 用来处理一个对 Servlet ...
- String 类的选择输出
package com.day_08.strings; /* * 通过API可知/String是在Java.lang包下的类,所以不用导包 */ public class StringDemo { p ...
- form表单中enctype属性作用
上传文件时,提交的表单属性里需要加enctype="multipart/form-data",才能提交文件信息,不然会报错.那么enctype属性的作用是什么?就是设置表单传输的编 ...
- 【转】Awk 命令学习总结、AWk命令系列学习(linux shell)
前面的话 学习linux 的同人,都知道linux shell文本处理能力非常强大.有一组强大的文本处理工具:grep,sed,awk . 其中grep 经常用作查找匹配文本.sed用作文本编辑替换. ...
- Ajax异步信息抓取方式
淘女郎模特信息抓取教程 源码地址: cnsimo/mmtao 网址:https://0x9.me/xrh6z 判断一个页面是不是Ajax加载的方法: 查看网页源代码,查找网页中加载的数据信息,如果 ...
- [DeeplearningAI笔记]神经网络与深度学习4.深度神经网络
觉得有用的话,欢迎一起讨论相互学习~Follow Me 4.2 深层神经网络中的前向传播 4.3 核对矩阵的维数 经验方法论 对于神经网络想增加得到没有bug的程序的概率的方法:需要仔细的思考矩阵的维 ...
- Trusted Execution Technology (TXT) --- 启动控制策略(LCP)篇
版权声明:本文为博主原创文章,未经博主允许不得转载.http://www.cnblogs.com/tsec/p/8428631.html 在TXT平台中,启动控制策略(Launch Control P ...