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 Format 如何使用

Yii2.如何在 MongoDB/ActiveQuery 中使用查找?

如何使用 phpunit 模拟 Yii@1.1 的 CActiveRecord(避免空属性)?

如何使用yii2菜单小部件uikit设置数据属性

如何使用 Yii 框架命令 DAO 对象进行联合所有命令

如何将模型数据加载到在 Yii 中使用 Ajax 过滤的 Select2 下拉列表