yii怎么连数据库

yii怎么连数据库

yii怎么连数据库?

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

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

推荐学习:yii框架

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

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

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

数据库Schema

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

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

yiidbTableSchema 用于描述表结构。

yiidbColumnSchema 用于描述字段信息。

yiidbpgsql, yiidbmysql, yiidbsqlite, yiidbmssql, yiidboci, yiidbcubird 下的各种schema,用于具体描述各种DBMS。

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

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

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

阿里云-虚拟数字人 阿里云-虚拟数字人

阿里云-虚拟数字人是什么? …

阿里云-虚拟数字人 2 查看详情 阿里云-虚拟数字人

Schema基类

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

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);    // ... ...}

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

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

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

class Schema extends yiidbSchema{    // 定义一个数据类型的映射关系    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,    ];}

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

表信息(Table Schema)

yiidbTableSchema 类用于描述数据表的信息:

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

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

列信息(Column Schema)

yiidbColumnSchema 类用于描述一个字段的信息,让我们来看一看:

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怎么连数据库的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/361369.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年11月6日 03:02:50
下一篇 2025年11月6日 03:04:11

相关推荐

  • Yii2中VarDumper与Yii::debug实时输出配置指南

    本文旨在解决yii2框架中,开发者在使用`vardumper::dump()`和`yii::debug()`进行调试时,输出内容无法立即显示的问题。核心解决方案是通过配置日志组件的`flushinterval`和`exportinterval`参数,确保日志消息能够即时写入文件,从而实现调试信息的实…

    2025年12月13日
    000
  • 如何在Yii框架中实现条件加载控制器及调试策略

    本文旨在探讨在yii框架及通用web开发中,如何安全有效地实现基于特定条件加载替代控制器或执行调试代码的需求。文章将从根本上解决在不影响生产环境用户的前提下进行测试和调试的挑战,并提供两种主要策略:利用独立的开发/测试环境,以及在受控条件下通过角色权限(rbac)启用调试功能,以确保开发流程的稳定性…

    2025年12月13日
    000
  • Laravel数据加密与解密:实现可逆敏感信息存储的教程

    在开发需要存储敏感信息(如密码管理器中的服务凭据)的应用时,如何在保证数据安全的同时实现可逆的存储与检索是一个常见挑战。本文将深入探讨Laravel框架提供的加密服务,指导您如何使用`Crypt` facade对字符串进行加密和解密,从而安全地存储那些需要原文显示的敏感数据,并强调其与一次性哈希的区…

    2025年12月13日
    000
  • 在Yii2配置中灵活添加自定义文本标签与标题

    本教程详细阐述如何在Yii2框架的配置数组中插入自定义文本标签或标题,以优化表单或设置页面的视觉结构。文章将通过具体的代码示例,指导用户在现有字段之间添加纯文本显示元素,并探讨不同实现方式及其对渲染结果的影响,帮助开发者理解并正确处理此类显示需求。 在Yii2等MVC框架中,我们经常通过结构化的数组…

    2025年12月13日
    000
  • 在PHP中处理POST JSON数据:解决$_POST为空的问题

    本文旨在解决php应用在接收application/json类型的post请求时,$_post超全局变量为空的问题。我们将深入解释$_post的工作机制,并提供一种标准且可靠的方法,通过读取php://input流来获取原始json数据,并进行解析,确保php后端能正确处理json格式的api请求。…

    2025年12月13日
    000
  • php中Yii框架添加redis

    在 Yii 2.x 中添加 Redis 支持需配置 redis 组件并注册到应用,确保已安装 redis 扩展、Redis 服务运行,并在 config/web.php 的 components 中配置 hostname、port 等参数,再通过 Yii::$app->redis 调用测试读写…

    2025年12月13日
    000
  • PHP页面加载超时:文件会话管理优化与解决方案

    本文旨在解决php应用中因文件会话管理不当导致的页面加载超时问题,特别是当出现“maximum execution time exceeded”错误时。我们将深入分析问题根源,提供短期缓解措施,包括优化php内置的会话垃圾回收机制和手动清理策略,并重点推荐采用redis等外部存储作为长期、高性能的会…

    2025年12月13日
    000
  • Yii2 日志与调试输出深度指南

    本文旨在解决 yii2 框架中调试信息(如 `yii::debug` 和 `vardumper::dump`)无法实时输出到日志文件或控制台的问题。通过详细解析 yii2 的日志机制,重点介绍 `filetarget` 配置中的 `flushinterval` 和 `exportinterval` …

    2025年12月13日
    000
  • 高效批处理更新:使用ActiveRecord优化多行多列数据更新

    本文旨在解决使用ActiveRecord循环更新多行数据时效率低下及可能遇到的问题。通过对比循环更新和数据库层面的批处理更新,我们将详细阐述为何后者是更优解,并提供基于ActiveRecord的批处理更新代码示例,以实现性能优化和数据更新的原子性与可靠性。 在开发数据库驱动的应用程序时,经常需要对数…

    2025年12月13日
    000
  • 在Yii2表单配置中插入自定义文本标签或标题

    本教程详细阐述如何在yii2的动态表单配置数组中,正确地插入非输入型的文本标签或章节标题,以增强表单的可读性和组织性。文章将通过示例代码演示如何构建此类配置项,并重点强调前端渲染逻辑对这些特殊标签的处理方式,确保它们能被正确识别和展示。 引言 在开发复杂的Web表单时,除了各种输入字段外,我们经常需…

    2025年12月13日
    000
  • Yii设置邮箱发文件的方法

    Yii框架需借助yii2-swiftmailer扩展实现邮件发送,配置mailer组件并设置SMTP参数,通过attach()或attachContent()添加附件,注意路径、编码及授权码等细节。 Yii 框架本身不直接提供邮件发送功能,需借助第三方扩展(如 yii2-swiftmailer)实现…

    2025年12月13日
    000
  • 在框架中基于条件动态管理控制器行为与业务逻辑:测试与调试策略

    本文探讨了在yii等web框架中,如何基于特定条件(如ip地址、用户角色)动态管理控制器行为和业务逻辑的策略。文章强调了在开发、测试和生产环境中实现条件性功能切换的最佳实践,包括利用专用开发环境、基于角色的访问控制(rbac)以及服务层面的抽象,旨在提高代码可维护性、安全性和调试效率。 在软件开发过…

    2025年12月13日
    000
  • Yii2 模块参数的正确配置与访问指南

    本文详细介绍了在 yii2 框架中如何为自定义模块配置和访问专属参数。针对常见的“undefined array key”错误,教程将阐述错误的配置方式,并提供在模块类中声明公共 `$params` 属性并在 `init()` 方法中进行初始化的正确实践,确保模块参数能够被有效管理和访问。 在 Yi…

    2025年12月13日
    000
  • Yii2模块参数配置指南:正确声明与访问模块级配置

    本文详细阐述了在Yii2框架中如何正确配置和访问模块特有的参数。区别于应用级参数配置,模块参数应作为模块类的公共属性进行声明和初始化。教程将通过示例代码,演示两种主要方法:在模块类中声明$params属性并通过配置文件加载,或直接在init()方法中赋值,并指导如何与应用通用参数进行合并,确保参数的…

    2025年12月13日
    000
  • ActiveRecord中高效批量更新数据:避免循环操作的陷阱

    本文旨在指导开发者如何在activerecord框架中高效地执行批量数据更新操作,避免使用循环逐行更新带来的性能问题和潜在错误。我们将对比低效的循环更新方法与推荐的数据库级批量更新方法,并通过具体代码示例,展示如何利用activerecord的查询构建器一次性更新多条记录,从而显著提升应用性能和数据…

    2025年12月13日
    000
  • ActiveRecord批量更新策略:高效处理多列数据

    本文深入探讨了在ActiveRecord框架下进行数据库批量更新的常见误区及优化方案。针对通过循环逐行更新的低效做法,文章提出并详细讲解了利用数据库层面单次查询进行批量更新的高效策略。通过代码示例和注意事项,帮助开发者理解如何避免性能瓶颈,实现更简洁、更可靠的数据批量操作。 批量更新的挑战与循环更新…

    2025年12月13日
    000
  • Yii框架怎么配置数据库_Yii框架数据库配置连接及操作详细步骤

    首先配置数据库连接,再通过ActiveRecord或Query Builder实现增删改查。在config/web.php中设置’db’组件的DSN、用户名、密码和字符集,确保PDO扩展启用;用Gii生成继承ActiveRecord的模型类;通过find()、save()、d…

    2025年12月12日
    000
  • PHP框架性能优化怎么做_PHP框架性能瓶颈分析与优化方案汇总

    PHP框架性能优化需要从代码执行效率、资源消耗、请求响应时间等多方面入手。很多开发者在使用Laravel、Symfony、Yii等全栈框架时,容易忽略底层机制带来的开销。性能瓶颈往往出现在自动加载、数据库查询、中间件处理和模板渲染环节。以下是常见问题与对应的优化策略。 1. 减少框架启动开销 每次请…

    2025年12月12日
    000
  • 在Yii2中高效转换SQL查询:以嵌套集模型为例

    本文详细介绍了在yii2框架中将现有sql查询转换为框架原生操作的两种主要方法:使用`createcommand()`执行原生sql和利用query builder构建复杂查询。通过一个嵌套集模型(nested set model)的菜单数据提取示例,我们将演示如何处理表别名、复杂的`between…

    2025年12月12日
    000
  • YII框架怎么配置_YII框架基础配置流程详细指南

    答案:配置YII框架需依次完成安装、数据库连接、URL美化、参数管理及调试设置。首先通过Composer创建项目;然后在config/db.php中配置数据库信息,并在web.php中引用;接着在web.php中启用urlManager并添加.htaccess重写规则;再通过params.php定义…

    2025年12月12日
    000

发表回复

登录后才能评论
关注微信