Yii如何使用数据库
Posted 我是谁???
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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如何使用数据库的主要内容,如果未能解决你的问题,请参考以下文章
Yii2.如何在 MongoDB/ActiveQuery 中使用查找?