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 模板高级篇总结
Dec 21 PHP
PHP与SQL注入攻击[一]
Apr 17 PHP
PHP中对用户身份认证实现两种方法
Jun 04 PHP
php字符串截取函数用法分析
Nov 25 PHP
php生成RSS订阅的方法
Feb 13 PHP
PHP获取文件夹大小函数用法实例
Jul 01 PHP
PHP最常用的正则表达式
Feb 13 PHP
PHP实现模拟http请求的方法分析
Dec 20 PHP
PHP实现按之字形顺序打印二叉树的方法
Jan 16 PHP
phpstorm 正则匹配删除空行、注释行(替换注释行为空行)
Jan 21 PHP
PHP切割汉字的常用方法实例总结
Apr 27 PHP
PHP控制循环操作的时间
Apr 01 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显示Facebook的粉丝数量方法
2014/01/08 PHP
php的zip解压缩类pclzip使用示例
2014/03/14 PHP
关于PHP的curl开启问题探讨
2014/04/08 PHP
PHP与MYSQL中UTF8编码的中文排序实例
2014/10/21 PHP
浅谈json_encode用法
2015/03/05 PHP
PHP实现伪静态方法汇总
2016/01/13 PHP
基于thinkphp6.0的success、error实现方法
2019/11/05 PHP
html读出文本文件内容
2007/01/22 Javascript
Javascript 文件夹选择框的两种解决方案
2009/07/01 Javascript
从数据结构的角度分析 for each in 比 for in 快的多
2013/07/07 Javascript
Extjs 4.x 得到form CheckBox 复选框的值
2014/05/04 Javascript
JS组件Bootstrap Table布局详解
2016/05/27 Javascript
酷! 不同风格页面布局幻灯片特效js实现
2021/02/19 Javascript
JS+canvas实现的五子棋游戏【人机大战版】
2017/07/19 Javascript
解决vue-cli webpack打包后加载资源的路径问题
2018/09/25 Javascript
Element Badge标记的使用方法
2020/07/27 Javascript
python实现画五角星和螺旋线的示例
2019/01/20 Python
在Python中过滤Windows文件名中的非法字符方法
2019/06/10 Python
django的ORM操作 增加和查询
2019/07/26 Python
python读取word 中指定位置的表格及表格数据
2019/10/23 Python
python with (as)语句实例详解
2020/02/04 Python
波兰灯具、照明和LED购物网站:Lampy.pl
2019/03/11 全球购物
Vivo俄罗斯官方在线商店:中国智能手机品牌
2019/10/04 全球购物
澳大利亚在线购买葡萄酒:The Wine Collective
2020/02/20 全球购物
Conforama西班牙:您的家具、装饰和电器商店
2020/02/21 全球购物
护理专业的自荐信
2013/10/22 职场文书
中英双版中文教师求职信
2013/10/27 职场文书
公司委托书格式范文
2014/04/04 职场文书
微电影大赛策划方案
2014/06/05 职场文书
上课玩手机的检讨书
2014/10/01 职场文书
社会实践活动总结
2015/02/05 职场文书
Python爬虫之爬取某文库文档数据
2021/04/21 Python
Python标准库之typing的用法(类型标注)
2021/06/02 Python
java中重写父类方法加不加@Override详解
2021/06/21 Java/Android
Python经常使用的一些内置函数
2022/04/11 Python
nginx访问报403错误的几种情况详解
2022/07/23 Servers