zoukankan      html  css  js  c++  java
  • Yii如何使用数据库

    1.Yii如何使用数据库

    Yii通过数据库访问对象(Database Access Objects,简称DAO)来使用数据库的。

    DAO建立在“PHP数据对象(PDO)之上,并提供一套面向对象的API来访问数据库”

    2.数据库的连接

    数据库的连接通常放在配置文件中,/common/config/main-local.php中。

     'db' => [
                'class' => 'yiidbConnection',
                'dsn' => 'mysql:host=localhost;dbname=yii2advanced',
                'username' => 'root',
                'password' => 'root',
                'charset' => 'utf8',
            ],

    这里表示会创建一个yiidbConnection对象,并用这个对象访问数据库。

    这个数据库连接对象的写法:Yii->$app->db

    连接不同数据库的语句略微有些差异。

    3,数据库查询(yiidbCommand)

    用SQL查询语句来创建一个yiidbCommand的对象,调用对象的方法来执行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,yiidbCommand的优缺点

    1,简单,只需要处理sql语句和数组就行了(优点)

    2,高效,通过sql语句来查询数据库非常高效。(优点)

    ----------------------------------------------------------

    1,不同的数据库系统的sql语句会有些差别,因此无法做到代码适用于多种数据库系统。(缺点)

    2,用数组,而没有用到面向对象的方式来管理数据,代码难维护。(缺点)

    3,如果不小心,会留下SQL注入这种不安全因素。(缺点)

    5,ActiveRecord

    (1)

    ActiveRecord(活动记录,简称AR类)提供了一项面向对象的接口,可以访问数据库中的数据。

    一个AR类关联一张数据表,每个AR对象对应表中的一行

    AR对象的属性,对应数据库的列

    可以直接以面向对象的方式来操纵数据库中的数据(AR把数据库和模型建立的联系),这样就不需要写SQL语句就能实现数据库的访问了。

     (2)声明ActiveRecord类

    通过继承yiidbActiveRecord基类来声明一个AR类,并实现tableName方法,返回与之相关联的数据表的名称

    class Post extends yiidbActiveRecord
    {
        /**
         * @inheritdoc
         */
        public static function tableName()
        {
            return 'post';
        }

    AR提供了两种方法来构建DB查询,返回AR对象。

    yiidbActiveRecord::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();

    此外可以通过 yiidbActiveRecord::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提供下边这些方法来实现插入,更新和删除等功能

    yiidbActiveRecord::insert()

    yiidbActiveRecord::update()

    yiidbActiveRecord::delete()

    yiidbActiveRecord::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)构建查询:创建一个yiidbQuery对象来代表一条SELECT SQL语句,然后通过调用一套可以串起来的方法,比如select方法,from方法,where方法等这些方法,构建出可以满足一定要求的查询条件。

    (2)执行查询。执行yiidbQuery的一个查询方法从数据库当中检索数据。例如:all(),one(),column()等这些查询方法。

    $allStatus = (new yiidbQuery())
    ->select(['name','id'])
    ->from('poststatus')
    ->indexBy('id')
    ->column();

    总结:

  • 相关阅读:
    awk 使用shell 变量
    设计模式之 外观(门面)模式 Facade
    设计模式之 抽象工厂模式
    python 第一课
    Visual Basic 图片连接地址添加
    smarty 不同模板 缓存时间
    PHP 传参过滤
    Nginx 0.7.x + PHP 5.2.10(FastCGI)搭建支持高并发量的Web服务器
    linux vi 编辑命令
    PHP 命令模式 执行文件 并传递参数
  • 原文地址:https://www.cnblogs.com/peteremperor/p/6401809.html
Copyright © 2011-2022 走看看