PHP自己的框架PDO数据表前缀、alias、model、table、join方法实现(完善篇九--结束)

news2025/1/23 9:23:06

一、实现功能,数据表前缀、alias、model、table、join方法实现

 

 二、表前缀实现

1、config.php增加表前缀
 'DB_PEX'=>'fa_',//数据库前缀
 2、增加表前缀方法function.php
function model($table){
    $model=new  ModelBase($table,config("DB_PEX"));
    return $model;
}
function table($table){
    return  new  ModelBase($table);
}
3、PDO数据表增加表前缀ModelBase.php
    private $pex="";//表前缀
    public function __construct($table=null,$pex=""){
        $this->pex=$pex;
        if($table){
            $this->table=$this->pex.$table;
        }
        if(!$this->table){
            die("no table" );
        }
        $this->_connect();
        $this->_opt();
    }

三、alias数据表别名和join实现实现ModelBase.php

    private function _opt(){
        $this->opt=array(
            'filed'=>'*',
            'where'=>'',
            'group'=>'',
            'having'=>'',
            'order'=>'',
            'limit'=>'',
            'alias'=>'',
            'join'=>'',
        );
    }

    public function alias($as){
        $this->opt['alias']=  ' as '.$as." ";
        return $this;
    }

    public function join($join,$condition,$type=''){
        $this->opt['join']=  " {$type} join ".$this->pex.trim($join)." on {$condition}";
        return $this;
    }
    public function select()
    {

        $sql = "SELECT ".$this->opt['filed']. " FROM ".$this->table.$this->opt['alias'].$this->opt['join'].$this->opt['where']
            .$this->opt['group'].$this->opt['having'].$this->opt['order'].$this->opt['limit'];

        $stmt = $this->pdo->prepare($sql);
        $stmt->execute();
        return $stmt->fetchAll(PDO::FETCH_ASSOC);
    }

四、控制器实现,数据表前缀、alias、model、table、join方法查询

 public function index(){
     $data= model("test")
         ->filed('t.*,r.role')
         ->alias('t')
         ->join('role r','t.id=r.testId','left')
         ->select();
     var_dump($data);
     $data= table("fa_test")->select();
     var_dump($data);
    }

五、完整ModelBase.php代码

<?php
class ModelBase
{
    public $pdo = NULL;
    public $table = NULL;
    public $opt;
    private $pex="";//表前缀
    public function __construct($table=null,$pex=""){
        $this->pex=$pex;
        if($table){
            $this->table=$this->pex.$table;
        }
        if(!$this->table){
            die("no table" );
        }
        $this->_connect();
        $this->_opt();
    }
    private function _connect(){

        if($this->pdo){
            return true;
        }
        $host = config('DB_HOST');
        $db = config('DB_DATABASE');
        $user = config('DB_USER');
        $pass =config('DB_PWD');

        $dsn = "mysql:host=$host;dbname=$db;charset=utf8";
        try {
            $this->pdo = new PDO($dsn, $user, $pass, [
                PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
            ]);
        } catch (PDOException $e) {
            die("数据库连接失败: " . $e->getMessage());
        }
    }

    private function _opt(){
        $this->opt=array(
            'filed'=>'*',
            'where'=>'',
            'group'=>'',
            'having'=>'',
            'order'=>'',
            'limit'=>'',
            'alias'=>'',
            'join'=>'',
        );
    }

    public function alias($as){
        $this->opt['alias']=  ' as '.$as." ";
        return $this;
    }

    public function join($join,$condition,$type=''){
        $this->opt['join']=  " {$type} join ".$this->pex.trim($join)." on {$condition}";
        return $this;
    }
    public function where($where){
        $this->opt['where']=  ' WHERE '.$where;
        return $this;
    }
    public function order($order){
        $this->opt['order']=  ' ORDER BY '.$order;
        return $this;
    }
    public function group($group){
        $this->opt['group']=  ' GROUP BY '.$group;
        return $this;
    }
    public function having($having){
        $this->opt['having']=  ' having '.$having;
        return $this;
    }
    public function filed($filed){
        $this->opt['filed']= $filed;
        return $this;
    }
    public function limit($limit){
        $this->opt['limit']=  ' limit '.$limit;
        return $this;
    }
    public function select()
    {

        $sql = "SELECT ".$this->opt['filed']. " FROM ".$this->table.$this->opt['alias'].$this->opt['join'].$this->opt['where']
            .$this->opt['group'].$this->opt['having'].$this->opt['order'].$this->opt['limit'];

        $stmt = $this->pdo->prepare($sql);
        $stmt->execute();
        return $stmt->fetchAll(PDO::FETCH_ASSOC);
    }
    public function find(){
        $data=$this->limit(1)->select();
        return current($data);
    }
    public function delete()
    {
        $sql = "DELETE FROM ".$this->table.$this->opt['where'];
        $stmt = $this->pdo->prepare($sql);
        $stmt->execute();
        return $stmt->rowCount();
    }
    public function insert( $data) {
        // 准备SQL语句
        $fields = implode(', ', array_keys($data));
        $values = ':' . implode(', :', array_keys($data));
        $sql = "INSERT INTO ". $this->table." (".$fields.") VALUES (".$values.")";
        // 绑定参数并执行SQL语句
        $stmt = $this->pdo->prepare($sql);
        foreach ($data as $key => $value) {
            $stmt->bindValue(':' . $key, $value);
        }
        return $stmt->execute();
    }


    public function update( $data)
    {
        if(empty($this->opt['where'])) die('更新语句必须有were条件');
        $up='';
        foreach ($data as $k=>$v){
            $up.="`".$k."`='".$v."'";
        }
        $sql="update  ".$this->table.' set '.$up.$this->opt['where'];
        $stmt = $this->pdo->prepare($sql);

        $stmt->execute();
        return $stmt->rowCount();
    }

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/942714.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

curl通过webdav操作alist

创建目录: url202320230828;curl -v -u "admin":"这里是密码" -X MKCOL "http://127.0.0.1:5244/dav/my189tianyi/${url2023}/" 上传文件: curl -v -u "admin":"这里是密码" -T /tmp/aa.json "http://127.0.0.1:52…

基于SSH的电影票预订系统

基于SSH的电影票预订系统 一、系统介绍二、功能展示1.其他系统实现五.获取源码 一、系统介绍 项目类型&#xff1a;Java web项目 项目名称&#xff1a;基于SSH的电影票预定系统 [dingpiao] 用户类型&#xff1a;有用户和管理员&#xff08;双角色&#xff09; 项目架构&…

C# 多线程交替按照指定顺序执行

1.关于AutoResetEvent和ManualResetEvent的区别解释如下&#xff1a; AutoResetEvent和ManualResetEvent是.NET中的两个线程同步类。它们之间的主要区别在于其释放信号的方式以及对等待线程的影响。 AutoResetEvent的作用是在等待的线程被信号唤醒后&#xff0c;将信号自动重…

Matlab图像处理-平移运算

几何运算 几何运算又称为几何变换&#xff0c;是将一幅图像中的坐标映射到另外一幅图像中的新坐标位置&#xff0c;它不改变图像的像素值&#xff0c;只是改变像素所在的几何位置&#xff0c;使原始图像按照需要产生位置、形状和大小的变化。 图像几何运算的一般定义为&#…

Atcoder Beginner Contest 317

A - Potions (atcoder.jp) AC代码: #include<iostream> #include<algorithm> #include<cstring> #include<cmath> #define endl \n //#define int long long using namespace std; typedef long long ll; const int N110; int a[N]; int n,h,x; void…

【高阶数据结构】map和set的介绍和使用 {关联式容器;键值对;map和set;multimap和multiset;OJ练习}

map和set的介绍和使用 一、关联式容器 关联式容器和序列式容器是C STL中的两种不同类型的容器。 关联式容器是基于键值对的容器&#xff0c;其中每个元素都有一个唯一的键值&#xff0c;可以通过键值来访问元素。关联式容器包括set、multiset、map和multimap。 序列式容器是…

从零做软件开发项目系列之七——用户培训

开展用户培训工作是确保软件项目成功的重要一环。以下是一个详细的步骤指南&#xff0c;用于规划和执行用户培训。 1. 确定培训目标和用户。 首先需要识别用户角色。确定项目中不同用户角色和职能&#xff0c;例如管理员、操作员、管理人员等。不同角色可能需要不同的培训内容…

14.工作式指针和数字时钟

源码 源码 <!doctype html> <html><head><meta charset="utf-8"><title>Clock</title><link rel="stylesheet" href="style.css"></head><body><div class="container">…

epoll 基于多线程的边沿非阻塞处理

往期文章推荐&#xff1a; epoll() 多路复用 和 两种工作模式_呵呵哒(&#xffe3;▽&#xffe3;)"的博客-CSDN博客https://blog.csdn.net/weixin_41987016/article/details/132523789?spm1001.2014.3001.5501 epoll_server.c #include <stdio.h> #include &l…

python venv 打包,更换路径后,仍然读取到旧路径 ,最好别换路径,采用docker封装起来

机械盘路径 /home/yeqiang/code/xxx 移动到 /opt/xxx 编辑/opt/xxx/venv/bin/activate VIRTUAL_ENV"/home/yeqiang/code/xxx/venv" 改为 VIRTUAL_ENV"/opt/xxx/venv" 下面还有这么多&#xff0c;参考&#xff1a; (venv) yeqiangyeqiang-MS-7B23:/…

Kubernetes入门 十一、网络之Service

目录 概述Service 原理Service 四种类型创建 Service代理 k8s 外部服务反向代理外部域名 概述 在 Kubernetes 中&#xff0c;Pod 是应用程序的载体&#xff0c;我们可以通过 Pod 的 IP 来访问应用程序&#xff0c;但是 Pod 的 IP 地址不是固定的&#xff0c;这就意味着不方便直…

MyBatisPlus实现多租户功能

前言&#xff1a;多租户是一种软件架构技术&#xff0c;在多用户的环境下&#xff0c;共有同一套系统&#xff0c;并且要注意数据之间的隔离性。 一、SaaS多租户简介 1.1、SaaS多租户 SaaS&#xff0c;是Software-as-a-Service的缩写名称&#xff0c;意思为软件即服务&#x…

【电源专题】读一读单节锂电池保护IC规格书

在文章【电源专题】单节锂离子电池的保护的基本原理 中我们了解了电池包的过充、过放、过流、短路等保护功能。那么这些功能都会在电池保护IC规格书中体现吗?体现在哪些地方?哪些参数是我们应关注的呢? 对于手册中的电压检测,如放电过流、充电过流和负载短路等检测电压都代…

开源软件的国际化和本地化

&#x1f337;&#x1f341; 博主猫头虎 带您 Go to New World.✨&#x1f341; &#x1f984; 博客首页——猫头虎的博客&#x1f390; &#x1f433;《面试题大全专栏》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &a…

centos7删除乱码文件

centos7删除乱码文件1. 小白教程&#xff0c;一看就会&#xff0c;一做就成。 1.解释 当文件名为乱码的时候&#xff0c;无法通过键盘输入文件名&#xff0c;所以在终端下就不能直接利用rm&#xff0c;mv等命令管理文件了。 但是每个文件都有一个i节点号&#xff0c;可以通过…

《Flink学习笔记》——第三章 Flink的部署模式

不同的应用场景&#xff0c;有时候对集群资源的分配和占用有不同的需求。所以Flink为各种场景提供了不同的部署模式。 3.1 部署模式&#xff08;作业角度/通用分类&#xff09; 根据集群的生命周期、资源的分配方式、main方法到底在哪里执行——客户端还是Client还是JobManage…

AIGC - 生成模型

AIGC - 生成模型 0. 前言1. 生成模型2. 生成模型与判别模型的区别2.1 模型对比2.2 条件生成模型2.3 生成模型的发展2.4 生成模型与人工智能 3. 生成模型示例3.1 简单示例3.2 生成模型框架 4. 表示学习5. 生成模型与概率论6. 生成模型分类小结 0. 前言 生成式人工智能 (Generat…

【最强最全】视频号下载助手(支持视频号视频, 直播,回放下载)

视频号下载助手支持视频号视频, 直播,回放的下载&#xff0c;本工具基于秦天sunny中间件编写&#xff0c;无需再使用其它抓包软件&#xff0c;无需再使用其它下载软件。 当然&#xff0c;你也可以右键复制抓取后的视频源再用其它下载软件下载。 使用说明 解压文件&#xff0c;…

CSS中如何实现弹性盒子布局(Flexbox)的换行和排序功能?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 换行&#xff08;Flexbox Wrapping&#xff09;⭐ 示例&#xff1a;实现换行⭐ 排序&#xff08;Flexbox Ordering&#xff09;⭐ 示例&#xff1a;实现排序⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 记得…