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 相关文章推荐
PHP VS ASP
Oct 09 PHP
基于asp+ajax和数据库驱动的二级联动菜单
May 06 PHP
php购物车实现代码
Oct 10 PHP
php数组保存文本与文本反编成数组实例
Nov 13 PHP
浅析THINKPHP的addAll支持的最大数据量
Feb 03 PHP
php上传文件并显示上传进度的方法
Mar 24 PHP
linux下为php添加iconv模块的方法
Feb 28 PHP
CI框架表单验证实例详解
Nov 21 PHP
PHP使用redis位图bitMap 实现签到功能
Oct 08 PHP
PHP使用JpGraph绘制折线图操作示例【附源码下载】
Oct 18 PHP
关于laravel框架中的常用目录路径函数
Oct 23 PHP
TP5框架model常见操作示例小结【增删改查、聚合、时间戳、软删除等】
Apr 05 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获取QQ达人QQ信息的方法
2015/03/05 PHP
重写javascript中window.confirm的行为
2012/10/21 Javascript
Javascript 判断是否存在函数的方法
2013/01/03 Javascript
Javascript 浮点运算的问题分析与解决方法
2013/08/27 Javascript
简单选项卡 js和jquery制作方法分享
2014/02/26 Javascript
Javascript学习笔记之 对象篇(一) : 对象的使用和属性
2014/06/24 Javascript
javaScript中两个等于号和三个等于号之间的区别介绍
2014/06/27 Javascript
用jquery实现动画跳到顶部和底部(这个比较简单)
2014/09/01 Javascript
AngularJS实现表单验证
2015/01/28 Javascript
js实现上传图片及时预览
2016/05/07 Javascript
jQuery实现圣诞节礼物传送(花式轮播)
2016/12/25 Javascript
express框架实现基于Websocket建立的简易聊天室
2017/08/10 Javascript
jQuery+CSS实现的table表格行列转置功能示例
2018/01/08 jQuery
jQuery实现点击图标div循环放大缩小功能
2018/09/30 jQuery
Node.js创建一个Express服务的方法详解
2020/01/06 Javascript
Vue组件通信$attrs、$listeners实现原理解析
2020/09/03 Javascript
Vant Weapp组件踩坑:picker的初始赋值解决
2020/11/12 Javascript
Python可跨平台实现获取按键的方法
2015/03/05 Python
Python针对给定字符串求解所有子序列是否为回文序列的方法
2018/04/21 Python
Python 调用PIL库失败的解决方法
2019/01/08 Python
pandas DataFrame 删除重复的行的实现方法
2019/01/29 Python
Django处理多用户类型的方法介绍
2019/05/18 Python
20行Python代码实现视频字符化功能
2020/04/13 Python
Python 读取位于包中的数据文件
2020/08/07 Python
torchxrayvision包安装过程(附pytorch1.6cpu版安装)
2020/08/26 Python
物理系毕业生自荐信
2013/11/01 职场文书
领导证婚人证婚词
2014/01/13 职场文书
境外导游求职信
2014/02/27 职场文书
个人委托书范本
2014/04/02 职场文书
实习生岗位职责
2014/04/12 职场文书
中班幼儿评语大全
2014/04/30 职场文书
优秀乡村医生事迹材料
2014/05/28 职场文书
九年级历史教学反思
2016/02/19 职场文书
基于Python实现的购物商城管理系统
2021/04/27 Python
通过Qt连接OpenGauss数据库的详细教程
2021/06/23 PostgreSQL
vue实现列表拖拽排序的示例代码
2022/04/08 Vue.js