Yii框架自定义数据库操作组件示例


Posted in PHP onNovember 11, 2019

本文实例讲述了Yii框架自定义数据库操作组件。分享给大家供大家参考,具体如下:

Yii 的数据库操作对象提供的方法确实很方便。 但是有的时候我们已经习惯了我们以前编写php的数据库操作语法,没有那么多时间去仔细看每个Yii提供的数据库操作语法,怎么办呢? 那就是一边学习,一边二次封装自己习惯的数据库操作类。 以后我们使用数据库操作对象,就用我们自己定义的组件去操作。

将我的数据库操作组件注册进配置文件web.php 中

array(
  'components' => array(
    //自定义数据库操作组件
    'dbOper'  => array(
      'class'   => 'app\components\DbOper\realization\DbRealization1'
    ),
    //Yii 框架数据库连接组件
    'db'      =>  array(
        'class'     => 'yii\db\Connection',
        'dsn'      => 'mysql:host=localhost;dbname=yii',
        'username'   => 'root',
        'password'   => '123456',
        'charset'    => 'utf8'
      );
  )
)

然后我们就可以在components 目录下定义我们的数据库操作类了。 因为,不知道怎么去获得php pdo 的原生操作对象,所以这里是对Yii数据库操作类的一个二次封装。

接口文件 DbOper.php 自定义的数据库操作类都得实现该接口

<?php
namespace app\components\DbOper;
/**
 * 自定义数据库操作组件 依赖系统定义组件db
 */
interface DbOper
{
  /**
   * 查询多条数据
   * @param
   * String $sql 需要查询的sql语句
   * array $keyVal 字段映射
   * @return
   * array 查询结果
   */
  public function fetchAll($sql='',$keyVal=array());
  /**
   * 查询一条数据 原生sql
   * @param
   * String $sql 需要查询的sql语句
   * array $keyVal 字段映射
   * @return
   * array 查询结果
   */
  public function fetch($sql='',$keyVal=array());
  /**
   * 添加数据
   * @param
   * String $tableName 表名
   * array $values 要插入的数据
   * @return
   * int 受影响的行数
   */
  public function insert($tableName='',$values=array());
  /**
   * 更新数据
   * @param
   * String $tableName 表名
   * array | String $where 修改条件 为 1 时更改该表所有的行
   * array $update 要更新的数据 
   * @return
   * int 受影响的行数
   */
  public function update($tableName='',$where='',$update=array());
  /**
   * 删除数据
   * @param
   * String $tableName 表名
   * array | String $where 删除条件
   * @return
   * int 受影响的行数
   */
  public function delete($tableName='',$where='');
  /**
   * 事务处理
   * @param
   * array $sqls 要执行的sql集合
   * return
   * boolean 是否执行成功
   */
  public function transcation($sqls = array());
  /**
   * 获得数据库链接
   */
  public function getYiiDbConnection();
}

针对DbOper 接口的实现类 DbRealization1.php

<?php
namespace app\components\DbOper\realization;
use Yii;
use app\components\DbOper\DbOper;
/**
 * 自定义数据库操作组件实现类
 */
class DbRealization1 implements DbOper
{
  private $db = null;
  /**
   * interface @Override
   */
  public function fetchAll($sql='',$keyVal=array())
  {
    if($sql === '')
      return array();
    $result = $this->getQueryObj($sql,$keyVal)->queryAll();
    if($result)
      return $result;
    else
      return array();
  }
  /**
   * interface @Override
   */
  public function fetch($sql='',$keyVal=array())
  {
    if($sql === '')
      return array();
    $result = $this->getQueryObj($sql,$keyVal)->queryOne();
    if($result)
      return $result;
    else
      return array();
  }
  /**
   * interface @Override
   */
  public function insert($tableName='',$values=array())
  {
    if($tableName === '')
      return 0;
    $insert = $this->getYiiDbConnection()->createCommand();
    if(is_array($values[0]))
    {
      $keys = array_keys($values[0]);
      return $insert->batchInsert($tableName,$keys,$values)->execute();
    }
    return $insert->insert($tableName,$values)->execute();
  }
  /**
   * interface @Override
   */
  public function update($tableName='',$where = '',$update=array())
  {
    if($tableName === '')
      return 0;
    if($where === '')
      return 0;
    return $this->getYiiDbConnection()
        ->createCommand()
        ->update($tableName,$update,$where)
        ->execute();
  }
  /**
   * interface @Override
   */
  public function delete($tableName='',$where='')
  {
    if($tableName === '')
      return 0;
    return $this->getYiiDbConnection()
        ->createCommand()
        ->delete($tableName,$where)
        ->execute();
  }
  /**
   * 获得查询操作对象
   * @return 
   * Object 
   */
  private function getQueryObj($sql='',$keyVal=array())
  {
    $query = $this->getYiiDbConnection()->createCommand($sql);
    if(!empty($keyVal))
      $query->bindValues($keyVal);
    return $query;
  }
  /**
   * interface @Override
   */
  public function transcation($sqls = array())
  {
    if(empty($sqls))
      return false;
    $db = $this->getYiiDbConnection();
    $outerTransaction = $db->beginTransaction();
    $runClient = true;
    try
    {
      foreach($sqls as $sql)
      {
        $db->createCommand($sql)->execute();
      }
      $outerTransaction->commit();
    }catch(\Exception $e){
      $runClient = false;
      $outerTransaction->rollback();
    }
    return $runClient;
  }
  /**
   * interface @Override
   */
  public function getYiiDbConnection()
  {
    if($this->db === null)
    {
      $this->db = Yii::$app->db;
    }
    return $this->db;
  }
}

注意:我的自定义数据库操作类 依赖 Yii::$app->db 这个组件, 也就是框架自带的数据库连接组件

然后我们就可以通过 Yii::$app->dbOper 去操作数据库了。

希望本文所述对大家基于Yii框架的PHP程序设计有所帮助。

PHP 相关文章推荐
Adodb的十个实例(清晰版)
Dec 31 PHP
php面向对象全攻略 (十六) 对象的串行化
Sep 30 PHP
php之CodeIgniter学习笔记
Jun 17 PHP
Destoon旺旺无法正常显示,点击提示“会员名不存在”的解决办法
Jun 21 PHP
ThinkPHP模板替换与系统常量及应用实例教程
Aug 22 PHP
实现PHP+Mysql无限分类的方法汇总
Mar 02 PHP
基于OpenCart 开发支付宝,财付通,微信支付参数错误问题
Oct 01 PHP
PHP实现伪静态方法汇总
Jan 13 PHP
thinkphp框架实现数据添加和显示功能
Jun 29 PHP
PHP三种方式实现链式操作详解
Jan 21 PHP
thinkPHP5.0框架整体架构总览【应用,模块,MVC,驱动,行为,命名空间等】
Mar 25 PHP
Laravel框架实现的rbac权限管理操作示例
Jan 16 PHP
php接口隔离原则实例分析
Nov 11 #PHP
Yii框架布局文件的动态切换操作示例
Nov 11 #PHP
Yii框架模拟组件调用注入示例
Nov 11 #PHP
在Laravel中使用MongoDB的方法示例
Nov 11 #PHP
PHP使用递归按层级查找数据的方法
Nov 10 #PHP
php和js实现根据子网掩码和ip计算子网功能示例
Nov 09 #PHP
PHP发送邮件确认验证注册功能示例【修改别人邮件类】
Nov 09 #PHP
You might like
PHP 中的类
2006/10/09 PHP
VB中的RasEnumConnections函数返回632错误解决方法
2014/07/29 PHP
Linux系统中设置多版本PHP共存配合Nginx服务器使用
2015/12/21 PHP
PHP多进程编程总结(推荐)
2016/07/18 PHP
js每次Title显示不同的名言
2008/09/25 Javascript
javascript eval和JSON之间的联系
2009/12/31 Javascript
Javascript计算两个marker之间的距离(Google Map V3)
2013/04/26 Javascript
jsPDF导出pdf示例
2014/05/02 Javascript
JavaScript跨域方法汇总
2014/10/16 Javascript
JavaScript检测实例属性, 原型属性
2015/02/04 Javascript
JavaScript制作windows经典扫雷小游戏
2015/03/31 Javascript
简介JavaScript中substring()方法的使用
2015/06/06 Javascript
jquery插件unobtrusive实现片段式加载
2015/06/15 Javascript
JavaScript运行过程中的“预编译阶段”和“执行阶段”
2015/12/16 Javascript
很棒的js选项卡切换效果
2016/07/15 Javascript
Vue.js常用指令汇总(v-if、v-for等)
2016/11/03 Javascript
jquery实现input框获取焦点的简单实例
2017/01/26 Javascript
从0到1构建vueSSR项目之路由的构建
2019/03/07 Javascript
JS如何定义用字符串拼接的变量
2020/07/11 Javascript
使用python装饰器验证配置文件示例
2014/02/24 Python
举例讲解Python设计模式编程的代理模式与抽象工厂模式
2016/01/16 Python
python使用电子邮件模块smtplib的方法
2016/08/28 Python
Python算法输出1-9数组形成的结果为100的所有运算式
2017/11/03 Python
Python如何应用cx_Oracle获取oracle中的clob字段问题
2019/08/27 Python
python模式 工厂模式原理及实例详解
2020/02/11 Python
浅谈keras中自定义二分类任务评价指标metrics的方法以及代码
2020/06/11 Python
Django如何实现防止XSS攻击
2020/10/13 Python
HTML5 本地存储和内容按需加载的思路和方法
2011/04/07 HTML / CSS
移动端Html5页面生成图片解决方案
2018/08/07 HTML / CSS
Sofmap官网:日本著名的数码电器专卖店
2017/05/19 全球购物
大学生毕业求职简历的自我评价
2013/10/24 职场文书
找工作最新求职信
2013/12/22 职场文书
文秘个人求职信范文
2014/04/22 职场文书
求职自我评价参考范文
2019/05/16 职场文书
Vite + React从零开始搭建一个开源组件库
2022/06/25 Javascript
Win11 22H2 2022怎么更新? 获得Win1122H22022版本升级技巧
2022/09/23 数码科技