侯体宗的博客
  • 首页
  • Hyperf版
  • beego仿版
  • 人生(杂谈)
  • 技术
  • 关于我
  • 更多分类
    • 文件下载
    • 文字修仙
    • 中国象棋ai
    • 群聊
    • 九宫格抽奖
    • 拼图
    • 消消乐
    • 相册

yii怎么连数据库

数据库  /  管理员 发布于 6年前   211

yii怎么连数据库?

深入理解Yii2.0之连接数据库

Yii使用PDO(PHP Date Object)连接各种各样的数据库,因此,几乎所有主流的数据库,Yii都可以 很好地提供支持。这也是一个成熟框架所应具有的广泛适用性。

推荐学习:yii框架

在对数据库进行任何操作之前,都必须先与数据库服务器建立连接。在Yii应用中,有一个专门的核心 组件(component)用于处理数据库连接,我们很容易可以在配置文件中找到他:

'components' => [    'db' => [        'class' => 'yii\db\Connection',        'dsn' => 'mysql:host=localhost;dbname=yii2advanced',        'username' => 'root',        'password' => '',        'charset' => 'utf8',    ],    // ... ...],// ... ...

这里有人肯定已经猜到了,Yii用 yii\db\Connection 来表示数据库连接。这个Connection实现了 对于PDO的一个简单封装,并掩盖了各种数据库的区别,实现了一个统一的开发接口。这样,使得你在 编程过程中,可以忽略绝大多数的数据库兼容问题,可以更加专注于功能开发。比如,你不用再担心在 MySQL下不能使用Money类型的字段等等。

数据库Schema

说到实现Connection独立于各种数据库,就不得不提到数据库Schema。Yii提供了各种主流的数据库 Schema,你甚至可以自己写一个Schema以适用自己独特的数据库管理系统(DBMS)。与Schema有关的类 有这么几个:

yii\db\Schema 抽象类,用于描述各种不同的DBMS的Schema。

yii\db\TableSchema 用于描述表结构。

yii\db\ColumnSchema 用于描述字段信息。

yii\db\pgsql, yii\db\mysql, yii\db\sqlite, yii\db\mssql, yii\db\oci, yii\db\cubird 下的各种schema,用于具体描述各种DBMS。

在 yii\db\Connection 中,有一个 $schemaMap 数组,用于建立PDO数据库驱动与具体的 schema 类间的映射关系:

public $schemaMap = [    'pgsql' => 'yii\db\pgsql\Schema', // PostgreSQL    'mysqli' => 'yii\db\mysql\Schema', // MySQL    'mysql' => 'yii\db\mysql\Schema', // MySQL    'sqlite' => 'yii\db\sqlite\Schema', // sqlite 3    'sqlite2' => 'yii\db\sqlite\Schema', // sqlite 2    'sqlsrv' => 'yii\db\mssql\Schema', // newer MSSQL driver on MS Windows hosts    'oci' => 'yii\db\oci\Schema', // Oracle driver    'mssql' => 'yii\db\mssql\Schema', // older MSSQL driver on MS Windows hosts    'dblib' => 'yii\db\mssql\Schema', // dblib drivers on GNU/Linux (and maybe other OSes) hosts    'cubrid' => 'yii\db\cubrid\Schema', // CUBRID];

我们可以认为Yii默认情况下支持上述数组中的10种DBMS(6个Schema),这在绝大多数情况下, 是完全足够的。万一你使用了超出这一范围的DBMS,在确保兼容的情况下,你可以自己写一个Schema, 使Yii可以支持该DBMS。

Schema基类

yii\db\Schema 是一个抽象类,具体的实现依赖于针对不同DBMS的6个子类Schema。擒贼先擒王, 读代码先读基类,我们就先来看看这个 yii\db\Schema 吧:

abstract class Schema extends Object{    // 预定义16种基本字段类型,这16种类型是与DBMS无关的,具体到特定的DBMS时,Yii会自动    // 转换成合适的数据库字段类型。    const TYPE_PK = 'pk';    const TYPE_BIGPK = 'bigpk';    const TYPE_STRING = 'string';    const TYPE_TEXT = 'text';    const TYPE_SMALLINT = 'smallint';    const TYPE_INTEGER = 'integer';    const TYPE_BIGINT = 'bigint';    const TYPE_FLOAT = 'float';    const TYPE_DECIMAL = 'decimal';    const TYPE_DATETIME = 'datetime';    const TYPE_TIMESTAMP = 'timestamp';    const TYPE_TIME = 'time';    const TYPE_DATE = 'date';    const TYPE_BINARY = 'binary';    const TYPE_BOOLEAN = 'boolean';    const TYPE_MONEY = 'money';    // 加载表schema,需要子类具体实现    abstract protected function loadTableSchema($name);    // ... ...}

yii\db\Schema 一上来就先针对各DBMS间差异最明显的字段数据类型进行统一,提供了16种基本的 字段类型。这16种类型与DBMS无关,在具体到特定的DBMS时,Yii会自动转换成合适的数据库字段类型 。我们在编程中,若需要指定字段类型,就使用这16种。这样的话,就不用考虑使用的类型具体的DBMS 是否支持的问题了。

这16种类型看着就知道是什么意思,我们就不展开讲了。

yii\db\Schema::loadTableSchema() 是整个基类中最重要的一语句了,他定义了一个函数,用于 加载表的schema,需要由子类针对特定的DBMS实现。这里,我们以 yii\db\mysql\Schema 子类为 例来讲解:

class Schema extends \yii\db\Schema{    // 定义一个数据类型的映射关系    public $typeMap = [        'tinyint' => self::TYPE_SMALLINT,        'bit' => self::TYPE_INTEGER,        'smallint' => self::TYPE_SMALLINT,        'mediumint' => self::TYPE_INTEGER,        'int' => self::TYPE_INTEGER,        'integer' => self::TYPE_INTEGER,        'bigint' => self::TYPE_BIGINT,        'float' => self::TYPE_FLOAT,        'double' => self::TYPE_FLOAT,        'real' => self::TYPE_FLOAT,        'decimal' => self::TYPE_DECIMAL,        'numeric' => self::TYPE_DECIMAL,        'tinytext' => self::TYPE_TEXT,        'mediumtext' => self::TYPE_TEXT,        'longtext' => self::TYPE_TEXT,        'longblob' => self::TYPE_BINARY,        'blob' => self::TYPE_BINARY,        'text' => self::TYPE_TEXT,        'varchar' => self::TYPE_STRING,        'string' => self::TYPE_STRING,        'char' => self::TYPE_STRING,        'datetime' => self::TYPE_DATETIME,        'year' => self::TYPE_DATE,        'date' => self::TYPE_DATE,        'time' => self::TYPE_TIME,        'timestamp' => self::TYPE_TIMESTAMP,        'enum' => self::TYPE_STRING,    ];}

yii\db\mysql\Schema 先是定义了一个映射关系,这个映射关系是MySQL数据库的字段类型与前面 我们提到的16种基本数据类型的映射关系。也就是说,基于MySQL的Schema,使用MySQL的字段类型,会 转换成统一的16种基本数据类型。

表信息(Table Schema)

yii\db\TableSchema 类用于描述数据表的信息:

class TableSchema extends Object{    public $schemaName; // 所属的Schema    public $name;       // 表名,不包含Schema部分    public $fullName;   // 表的完整名称,可能包含一个Schema前缀。    public $primaryKey = [];        // 主键    public $sequenceName;           // 主键若使用sequence,该属性表示序列名    public $foreignKeys = [];       // 外键    public $columns = [];           // 字段    // ... ...}

从上面的代码来看, yii\db\TableSchema 比较简单。上述的属性看一看就大致可以了解是干什么 用的。这里我们点一点,了解下就可以了。

列信息(Column Schema)

yii\db\ColumnSchema 类用于描述一个字段的信息,让我们来看一看:

class ColumnSchema extends Object{    public $name;   // 字段名    public $allowNull;          // 是否可以为NULL    /**     * @var string abstract type of this column. Possible abstract types include:     * string, text, boolean, smallint, integer, bigint, float, decimal, datetime,     * timestamp, time, date, binary, and money.     */    public $type;   // 字段的类型    /**     * @var string the PHP type of this column. Possible PHP types include:     * `string`, `boolean`, `integer`, `double`.     */    public $phpType;// 字段类型对应的PHP数据类型    /**     * @var string the DB type of this column. Possible DB types vary according to the type of DBMS.     */    public $dbType;    public $defaultValue;       // 字段默认值    public $enumValues;         // 若字段为枚举类型,该属性用于表示可供枚举的值    /**     * @var integer display size of the column.     */    public $size;    public $precision;          // 若字段为数值,该属性用于表示精度    /**     * @var integer scale of the column data, if it is numeric.     */    public $scale;    /**     * @var boolean whether this column is a primary key     */    public $isPrimaryKey;       // 是否是主键    public $autoIncrement = false;      // 是否是自增长字段    /**     * @var boolean whether this column is unsigned. This is only meaningful     * when [[type]] is `smallint`, `integer` or `bigint`.     */    public $unsigned;           // 是否是unsigned,仅对支持的类型有效    public $comment;// 字段描述信息    /**     * Converts the input value according to [[phpType]] after retrieval from the database.     * If the value is null or an [[Expression]], it will not be converted.     * @param mixed $value input value     * @return mixed converted value     */    public function phpTypecast($value)    {        if ($value === '' && $this->type !== Schema::TYPE_TEXT && $this->type !== Schema::TYPE_STRING && $this->type !== Schema::TYPE_BINARY) {return null;        }        if ($value === null || gettype($value) === $this->phpType || $value instanceof Expression) {return $value;        }        switch ($this->phpType) {case 'resource':case 'string':    return is_resource($value) ? $value : (string) $value;case 'integer':    return (int) $value;case 'boolean':    return (bool) $value;case 'double':    return (double) $value;        }        return $value;    }    /**     * Converts the input value according to [[type]] and [[dbType]] for use in a db query.     * If the value is null or an [[Expression]], it will not be converted.     * @param mixed $value input value     * @return mixed converted value. This may also be an array containing the value as the first element     * and the PDO type as the second element.     */    public function dbTypecast($value)    {        // the default implementation does the same as casting for PHP but it should be possible        // to override this with annotation of explicit PDO type.        return $this->phpTypecast($value);    }}

以上就是yii怎么连数据库的详细内容,更多请关注其它相关文章!


  • 上一条:
    yii如何连接数据库
    下一条:
    yii数据库配置在哪里
  • 昵称:

    邮箱:

    0条评论 (评论内容有缓存机制,请悉知!)
    最新最热
    • 分类目录
    • 人生(杂谈)
    • 技术
    • linux
    • Java
    • php
    • 框架(架构)
    • 前端
    • ThinkPHP
    • 数据库
    • 微信(小程序)
    • Laravel
    • Redis
    • Docker
    • Go
    • swoole
    • Windows
    • Python
    • 苹果(mac/ios)
    • 相关文章
    • 分库分表的目的、优缺点及具体实现方式介绍(0个评论)
    • DevDB - 在 VS 代码中直接访问数据库(0个评论)
    • 在ubuntu系统中实现mysql数据存储目录迁移流程步骤(0个评论)
    • 在mysql中使用存储过程批量新增测试数据流程步骤(0个评论)
    • php+mysql数据库批量根据条件快速更新、连表更新sql实现(0个评论)
    • 近期文章
    • 智能合约Solidity学习CryptoZombie第一课:生成一只你的僵尸(0个评论)
    • 在go中实现一个常用的先进先出的缓存淘汰算法示例代码(0个评论)
    • 在go+gin中使用"github.com/skip2/go-qrcode"实现url转二维码功能(0个评论)
    • 在go语言中使用api.geonames.org接口实现根据国际邮政编码获取地址信息功能(1个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf分页文件功能(0个评论)
    • gmail发邮件报错:534 5.7.9 Application-specific password required...解决方案(0个评论)
    • 欧盟关于强迫劳动的规定的官方举报渠道及官方举报网站(0个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf文件功能(0个评论)
    • Laravel从Accel获得5700万美元A轮融资(0个评论)
    • 在go + gin中gorm实现指定搜索/区间搜索分页列表功能接口实例(0个评论)
    • 近期评论
    • 122 在

      学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..
    • 123 在

      Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..
    • 原梓番博客 在

      在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..
    • 博主 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..
    • 1111 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
    • 2017-06
    • 2017-08
    • 2017-09
    • 2017-10
    • 2017-11
    • 2018-01
    • 2018-05
    • 2018-10
    • 2018-11
    • 2020-02
    • 2020-03
    • 2020-04
    • 2020-05
    • 2020-06
    • 2020-07
    • 2020-08
    • 2020-09
    • 2021-02
    • 2021-04
    • 2021-07
    • 2021-08
    • 2021-11
    • 2021-12
    • 2022-02
    • 2022-03
    • 2022-05
    • 2022-06
    • 2022-07
    • 2022-08
    • 2022-09
    • 2022-10
    • 2022-11
    • 2022-12
    • 2023-01
    • 2023-03
    • 2023-04
    • 2023-05
    • 2023-07
    • 2023-08
    • 2023-10
    • 2023-11
    • 2023-12
    • 2024-01
    • 2024-03
    Top

    Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号 PHP交流群

    侯体宗的博客