热搜: 分页类  PHP  Windows补丁  验证码  Jpgraph  替换  收机  windows7  Swift  Laravel 
  • 首 页
  •  
     
    当前位置: 首页 » 编程语言 » PHP教程 » 正文

    yii2的数据库层设计

    放大字体  缩小字体 发布日期:2017-02-05  浏览次数:267
    核心提示:Yii2在M层的抽象做的很经典,值得分析理解。QueryBuilder不同的数据库引擎(mysql,oracle…)执行相同的SQL,可能语法有一些细微的差异,但是SQL整体语法差别不大,所以会定义一个QueryBuilder基类,它提供一般通用的SQL生成方法,具体每个数据库引擎继承Quer

    Yii2在M层的抽象做的很经典,值得分析理解。

    QueryBuilder

    不同的数据库引擎(mysql,oracle…)执行相同的SQL,可能语法有一些细微的差异,但是SQL整体语法差别不大,所以会定义一个QueryBuilder基类,它提供一般通用的SQL生成方法,具体每个数据库引擎继承QueryBuilder,如果存在细微差异只需覆盖特定的方法既可。

    简单说,QueryBuilder用来构造SQL语句(读SQL和写SQL都可以),但是并不执行它,通过调用它的where,groupBy,orderBy,select,insert等方法传入结构化的语句组成部分,最终由QueryBuilder返回一个字符串的SQL语句。

    Query

    仅提供查询能力,不支持修改,它也提供where,groupBy,select等方法(注意不支持insert,update这种修改操作),但是它本身没有生成SQL的能力,仅仅是在QueryBulder之上提供一个通用层,最终在调用它的one或者all方法时会将SQL的各个组成部分一次性交给QueryBuilder构造出SQL语句,那么Query对象怎么知道用哪个QueryBuilder呢?

    Query对象会通过application->get(“db”)拿到配置的数据库连接connection对象,这个connection对象自然是知道自己连接的是哪种数据库引擎,因此可以通过它拿到对应的queryBuilder对象。具体来说,connection对象创建时会从配置中取到这样的配置:

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

    Connection对象根据dsn知道对应的数据库引擎,从而创建对应的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
    ];
    

    而这个Schema对象是每个数据库引擎各自实现的,它们有一个方法可以返回对应的QueryBuilder对象:

    /**
    * @return QueryBuilder the query builder for this connection.
    */
    public function getQueryBuilder()
    {
        if ($this->_builder === null) {
            $this->_builder = $this->createQueryBuilder();
        }
     
        return $this->_builder;
    }
    

    但是需要注意,虽然经过QueryBuilder生成了SQL,但是Query并不是自己直接执行这个SQL,而是将这个任务交给了下面这个类。

    Command

    这个类需要由connection对象创建的,内部保存了从connection对象取来的pdo数据库连接。command类的定位是直接执行SQL,也提供bind参数的能力,它不再限制SQL是读还是写,这也是为什么Query类不直接使用connection的pdo连接执行读SQL而是把构造来的SQL交给command,因为command类才是负责执行所有SQL的合适角色,职责集中在Command对象是一个合理的设计。

    根据这个认识,我们知道Command类可以直接执行裸SQL,读和写都是可以的。

    ActiveQuery

    之前的Query算一个调度者,它从用户收集查询的组成要素,交给QueryBuilder生成SQL,最后交给Command完成SQL的执行,拿回来的结果都是数组形式的一行一行的数据。

    ActiveQuery则是在Query基础上(继承自Query),额外提供了ORM能力,主要包含2点:数据库行映射为对象(就是指ActiveRecord,也是一个model),以及表的关联关系。

    我们知道Query的one和all都是返回关联数组形式的结果集,而ActiveRecord则覆盖了这两个方法,为每一行数据生成对应的activeRecord对象并把列值填充到对象里,这样就实现了数据库行和程序对象的自动映射,大概就是这种关系了。


    小编为您推荐“yii2的数据库层设计”相关文章

    c#序列化详解示例
    序列化是将对象状态转换为可保持或传输的格式的过程。与序列化相对的是反序列化,它将流转换为对象。这两个过程结合起来,可以轻松地存储和传输数据

    在Shell命令行处理JSON数据的方法
    这篇文章主要介绍了在Shell命令行处理JSON数据的方法,使用jq工具实现,需要的朋友可以参考下

    C语言安全编码之数组索引位的合法范围
    这篇文章主要介绍了C语言安全编码的数组索引位合法范围剖析,对于编码安全非常重要!需要的朋友可以参考下

    Win7下手动安装apache2.2、php5.4笔记
    这篇文章主要介绍了Win7下手动安装apache2.2、php5.4笔记,本文是个人手动操作记录,需要的朋友可以参考下

    c#文件名/路径处理方法示例
    这篇文章主要介绍了c#文件名/路径处理方法,大家写代码处理文件的时候会常用到

     
    TAGS: SQL Yii
     
     
    猜你想看
     
    更多..
    与本文有关SQL
    • Laravel专供:实现Schemaless
      之所以要实现 Schemaless,主要是因为在线 DDL 有很多痛点,关于这一点,我在以前已经写过文章,没看过的不妨看看「史上最LOW的在线DDL解决方案」,不过那篇文章主要以介绍为主,并没有涉及具体的实现,所以我写了一个 Laravel 的例子。首先创建测试用的 user
      02-05 关键词:LaravelMySQL
    • XAMPP with PHP 7.1.1, 7.0.15 & 5.6.30 发
      XAMPP with PHP 7.1.1, 7.0.155.6.30 发布了,XAMPP=Apache + MySQL + PHP + Perl,是一个完全免费,易于安装和使用Apache发行版,包含了Apache、MySQL、PHP和Perl。支持Windows、Linux和OS X,是目前最流行的PHP开发环境。安装包同时提供phpMyAdmin、Webaliz
      02-05 关键词:PHPMySQL
    • 如何解决生产机上php代码连接mysql报错的故障
      如何解决生产机上php代码连接mysql报错的故障
      大家好:今天分享一则当生产机上的网站php代码不能连接Mysql服务器时怎么办?当LNMP的网站建立好后,我们需要测试网站中的php代码。但发现如下报错怎么办?解决方法如下:mysql show databases;+——————–+| Database |+——————–+| information_sc
      12-23 关键词:MySQLPHP
    • 如何在mysql中查询每个分组的前几名
      #问题#在工作中常会遇到将数据分组排序的问题,如在考试成绩中,找出每个班级的前五名等。在orcale等数据库中可以使用partition 语句来解决,但在mysql中就比较麻烦了。这次翻译的文章就是专门解决这个问题的原文地址: [How to select the first/least/max ro
      12-23 关键词:MySQLPEAR
    • CentOS 6.5 LAMP分主机平台的搭建及测试
      CentOS 6.5 LAMP分主机平台的搭建及测试
      前言 前面的文章我们谈到过了LAMP的基础原理以及很多的相关知识了、尤其是httpd、这个强大的、牛气轰轰的web服务器想必大们都再熟悉不过了吧、对他的介绍我们也谈了很多了、这里不再做介绍、那接下来我们就是分主机来实现LAMP平台的搭建以及动静页面的测试、
      12-01 关键词:MySQLPHP
    • 【技术分享】关于PHP内部编码与mysql字符差异问题的研究
      【技术分享】关于PHP内部编码与mysql字符差异问
      作者: bendawangs 预估稿费:400RMB(不服你也来投稿啊!) 投稿方式:发送邮件至linwei#360.cn,或登陆网页版在线投稿 0x01 引入最近稍稍研究了下关于PHP的内部编码的问题,以及mysql的字符差异的问题,分享下心得,如果有误请大家及时指正。至于为什么要介
      11-22 关键词:PHPMySQL
    • 从 MySQL Workbench 的 ER 设计图导出 Laravel 迁移文件
      从 MySQL Workbench 的 ER 设计图导出 Laravel
      要说数据库的设计工具,我用过最好用的就是 MySQL Workbench 了( MySql 自己产品,免费使用 ),别的不多说,看下图我的项目的 ER 设计图就知道了(注意左上角小地图,能看到稍微上点规模的项目的数据库设计是非常方便的):过去我是这样做:先设计好数据库
      11-22 关键词:MySQLLaravel
    • XAMPP 版本历史: Apache, MySQL, and PHP
      Windows系统下使用XMAPP可以方便的使用多个不同的PHP版本。Apache Friends offerolder versions of XAMPP through SourceForge, allowing developers to download the version that most closely resembles their server environment, but unhelpfully don’t
      11-22 关键词:PHPMySQL
    • laravel 学习笔记 —— 查询构造器(下)
      来继续填坑(上个月没发,因此这个月至少两篇)。上一篇laravel 学习笔记 —— 查询构造器(下)中我们正在开始分析查询构造器的where方法,作为出场率最高的方法,其中相关的玩意儿足以帮助我们去理解整个组件大致的设计思路和实现细节。由于整体分析实在是
      11-16 关键词:LaravelSQL
    • phpMyAdmin中sql-parser组件的使用
      phpMyAdmin是一款基于Web端运行的开源数据库管理工具,支持管理MySQL和MariaDB两种数据库。 phpMyAdmin的程序主要使用php和javascript开发,它的安装使用都比较简单而且已有很多相关介绍不再重复,今天要介绍的是源码中的一个核心组件sql-parser。sql-parser
      11-10 关键词:PHPphpMyAdmin
     
    相关评论
     
    猜你喜欢
     
    网站首页 | 关于我们 | 联系方式 | 使用协议 | 版权隐私 | 网站地图 | 网站留言