<?php
namespace think\db;
use PDO;
use think\App;
use think\Cache;
use think\Collection;
use think\Config;
use think\Db;
use think\db\exception\BindParamException;
use think\db\exception\DataNotFoundException;
use think\db\exception\ModelNotFoundException;
use think\Exception;
use think\exception\DbException;
use think\exception\PDOException;
use think\Loader;
use think\Model;
use think\model\Relation;
use think\model\relation\OneToOne;
use think\Paginator;
class Query
{
// 数据库Connection对象实例
protected $connection;
// 数据库Builder对象实例
protected $builder;
// 当前模型类名称
protected $model;
// 当前数据表名称(含前缀)
protected $table = '';
// 当前数据表名称(不含前缀)
protected $name = '';
// 当前数据表主键
protected $pk;
// 当前数据表前缀
protected $prefix = '';
// 查询参数
protected $options = [];
// 参数绑定
protected $bind = [];
// 数据表信息
protected static $info = [];
// 回调事件
private static $event = [];
// 读取主库
private static $readMaster = [];
/**
* 构造函数
* @access public
* @param Connection $connection 数据库对象实例
* @param Model $model 模型对象
*/
public function __construct(Connection $connection = null, $model = null)
{
$this->connection = $connection ?: Db::connect([], true);
$this->prefix = $this->connection->getConfig('prefix');
$this->model = $model;
// 设置当前连接的Builder对象
$this->setBuilder();
}
/**
* 利用__call方法实现一些特殊的Model方法
* @access public
* @param string $method 方法名称
* @param array $args 调用参数
* @return mixed
* @throws DbException
* @throws Exception
*/
public function __call($method, $args)
{
if (strtolower(substr($method, 0, 5)) == 'getby') {
// 根据某个字段获取记录
$field = Loader::parseName(substr($method, 5));
$where[$field] = $args[0];
return $this->where($where)->find();
} elseif (strtolower(substr($method, 0, 10)) == 'getfieldby') {
// 根据某个字段获取记录的某个值
$name = Loader::parseName(substr($method, 10));
$where[$name] = $args[0];
return $this->where($where)->value($args[1]);
} else {
throw new Exception('method not exist:' . __CLASS__ . '->' . $method);
}
}
/**
* 获取当前的数据库Connection对象
* @access public
* @return Connection
*/
public function getConnection()
{
return $this->connection;
}
/**
* 切换当前的数据库连接
* @access public
* @param mixed $config
* @return $this
*/
public function connect($config)
{
$this->connection = Db::connect($config);
$this->setBuilder();
$this->prefix = $this->connection->getConfig('prefix');
return $this;
}
/**
* 设置当前的数据库Builder对象
* @access protected
* @return void
*/
protected function setBuilder()
{
$class = $this->connection->getBuilder();
$this->builder = new $class($this->connection, $this);
}
/**
* 获取当前的模型对象实例
* @access public
* @return Model|null
*/
public function getModel()
{
return $this->model;
}
/**
* 设置后续从主库读取数据
* @access public
* @param bool $allTable
* @return void
*/
public function readMaster($allTable = false)
{
if ($allTable) {
$table = '*';
} else {
$table = isset($this->options['table']) ? $this->options['table'] : $this->getTable();
}
static::$readMaster[$table] = true;
return $this;
}
/**
* 获取当前的builder实例对象
* @access public
* @return Builder
*/
public function getBuilder()
{
return $this->builder;
}
/**
* 指定默认的数据表名(不含前缀)
* @access public
* @param string $name
* @return $this
*/
public function name($name)
{
$this->name = $name;
return $this;
}
/**
* 指定默认数据表名(含前缀)
* @access public
* @param string $table 表名
* @return $this
*/
public function setTable($table)
{
$this->table = $table;
return $this;
}
/**
* 得到当前或者指定名称的数据表
* @access public
* @param string $name
* @return string
*/
public function getTable($name = '')
{
if ($name || empty($this->table)) {
$name = $name ?: $this->name;
$tableName = $this->prefix;
if ($name) {
$tableName .= Loader::parseName($name);
}
} else {
$tableName = $this->table;
}
return $tableName;
}
/**
* 将SQL语句中的__TABLE_NAME__字符串替换成带前缀的表名(小写)
* @access public
* @param string $sql sql语句
* @return string
*/
public function parseSqlTable($sql)
{
if (false !== strpos($sql, '__')) {
$prefix = $this->prefix;
$sql = preg_replace_callback("/__([A-Z0-9_-]+)__/sU", function ($match) use ($prefix) {
return $prefix . strtolower($match[1]);
}, $sql);
}
return $sql;
}
/**
* 执行查询 返回数据集
* @access public
* @param string $sql sql指令
* @param array $bind 参数绑定
* @param boolean $master 是否在主服务器读操作
* @param bool|string $class 指定返回的数据集对象
* @return mixed
* @throws BindParamException
* @throws PDOException
*/
public function query($sql, $bind = [], $master = false, $class = false)
{
return $this->connection->query($sql, $bind, $master, $class);
}
/**
* 执行语句
* @access public
* @param string $sql sql指令
* @param array $bind 参数绑定
* @return int
* @throws BindParamException
* @throws PDOException
*/
public function execute($sql, $bind = [])
{
return $this->connection->execute($sql, $bind, $this);
}
/**
* 获取最近插入的ID
* @access public
* @param string $sequence 自增序列名
* @return string
*/
public function getLastInsID($sequence = null)
{
return $this->connection->getLastInsID($sequence);
}
/**
* 获取最近一次查询的sql语句
* @access public
* @return string
*/
public function getLastSql()
{
return $this->connection->getLastSql();
}
/**
* 执行数据库事务
* @access public
* @param callable $callback 数据操作方法回调
* @return mixed
*/
public function transaction($callback)
{
return $this->connection->transaction($callback);
}
/**
* 启动事务
* @access public
* @return void
*/
public function startTrans()
{
$this->connection->startTrans();
}
/**
* 用于非自动提交状态下面的查询提交
* @access public
* @return void
* @throws PDOException
*/
public function commit
没有合适的资源?快使用搜索试试~ 我知道了~
易优CMS响应式模板+E000896精密机器机械制造网站模板.zip
共1557个文件
php:481个
png:262个
htm:192个
需积分: 5 0 下载量 99 浏览量
2025-01-08
08:57:43
上传
评论
收藏 16.66MB ZIP 举报
温馨提示
易优CMS响应式模板+E000896精密机器机械制造网站模板.zip
资源推荐
资源详情
资源评论
收起资源包目录
易优CMS响应式模板+E000896精密机器机械制造网站模板.zip (1557个子文件)
test.bmp 0B
amazeui.min.css 249KB
bootstrap.css 138KB
bootstrap.min.css 115KB
main.css 78KB
main.css 76KB
ueditor.css 44KB
index.css 39KB
font-awesome-ie7.min.css 37KB
font-awesome-ie7.min.css 37KB
ueditor.min.css 34KB
style.css 28KB
font-awesome.css 26KB
font-awesome.css 26KB
font-awesome.min.css 23KB
font-awesome.min.css 22KB
font-awesome.min.css 22KB
video-js.css 21KB
jquery-ui.min.css 20KB
jquery-ui.min.css 20KB
swiper.min.css 19KB
image.css 19KB
style.css 16KB
video.css 15KB
attachment.css 15KB
layer.css 14KB
style.css 13KB
video-js.min.css 11KB
jquery.qtip.min.css 11KB
imgshare.css 10KB
shCoreBlue.css 9KB
shCoreDefault2.css 9KB
codemirror.css 8KB
shCoreDefault.css 7KB
install.css 7KB
zTreeStyle.css 7KB
laydate.css 6KB
slide_share.css 6KB
layer.css 5KB
login.css 5KB
share_popup.css 5KB
share_style2_16.css 4KB
share_style2_24.css 4KB
share_style1_16.css 4KB
share_style1_24.css 4KB
like.css 4KB
share_style0_16.css 4KB
scrawl.css 4KB
share_style1_32.css 4KB
share_style2_32.css 4KB
share_style0_24.css 4KB
share_style0_32.css 4KB
dialog.css 4KB
laydate.css 3KB
laydate.css 3KB
laydate.css 3KB
page.css 3KB
page.css 3KB
iframe.css 3KB
codemirror.css 3KB
select_share.css 3KB
charts.css 3KB
perfect-scrollbar.min.css 3KB
perfect-scrollbar.min.css 2KB
perfect-scrollbar.min.css 2KB
background.css 2KB
share_style4.css 2KB
share_style2.css 2KB
emotion.css 2KB
dialogbase.css 2KB
music.css 2KB
style.css 1KB
edittable.css 1KB
template.css 1KB
weixin_popup.css 934B
webuploader.css 515B
webuploader.css 515B
help.css 395B
eyou.css 354B
iframe.css 42B
pinyin.dat 53KB
Thumbs.db 24KB
fontawesome-webfont.eot 59KB
fontawesome-webfont.eot 55KB
fontawesome-webfont.eot 55KB
glyphicons-halflings-regular.eot 20KB
vjs.eot 3KB
UEditorSnapscreen.exe 508KB
hiddeninput.exe 9KB
test.gif 233KB
wface.gif 49KB
jxface2.gif 40KB
yface.gif 28KB
bface.gif 27KB
icons.gif 20KB
file-icons.gif 20KB
file-icons.gif 20KB
tface.gif 19KB
fface.gif 18KB
loading.gif 11KB
共 1557 条
- 1
- 2
- 3
- 4
- 5
- 6
- 16
资源评论
程序员阿凡提
- 粉丝: 712
- 资源: 10
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 易优CMS响应式模板PHP+Mysql+E000673职业教育培训机构网站模板.zip
- 淘系对账实操课程详解:从订单处理到绩效工资核算,全面掌握电商财务管理.mp4
- Linux-C编程一站式学习-最新版
- 2021新版散热器风扇马达组装生产线(sw20可编辑+工程图)全套技术资料100%好用.zip
- KR C5 控制柜安装指南中文说明书
- 玩转小红书电商:从选品到上架,再到笔记发布与流量获取,一站式指南.mp4
- 突破销售瓶颈,掌握销冠三火轮,实现业绩持续增长的销售技能课.mp4
- 详细教你自媒体视频二剪搬运技术,自己加工100%过原创,无脑搬运.mp4
- Kaggle实战之Rossmann商店销售预测数据
- Muse-Ant-Desgin-Vue 改造成vue3的代码
- 小红书电商项目全解析,包括账号搭建、店铺运营、笔记发布 实现流量变现.mp4
- 小红书电商引流教程:从基础操作到发布内容,引流技巧,轻松打造爆款产品.mp4
- 前端开发领域中JavaScript语言的基础理论与实战指南
- RTA-OS3.1-Reference-Guide
- linux下的webstorm的deb安装包002
- 小红书实战训练营:精准定位用户,传授六个技巧,助你写出爆款笔记.mp4
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功