<?php
// +----------------------------------------------------------------------
// | ThinkPHP [ WE CAN DO IT JUST THINK ]
// +----------------------------------------------------------------------
// | Copyright (c) 2006~2018 http://thinkphp.cn All rights reserved.
// +----------------------------------------------------------------------
// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
// +----------------------------------------------------------------------
// | Author: liu21st <liu21st@gmail.com>
// +----------------------------------------------------------------------
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 = [];
// 读取主库
protected 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]);
} elseif ($this->model && method_exists($this->model, 'scope' . $method)) {
// 动态调用命名范围
$method = 'scope' . $method;
array_unshift($args, $this);
call_user_func_array([$this->model, $method], $args);
return $this;
} 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)
没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
收起资源包目录
【短视频系统】2020.05中旬首发YYC松鼠短视频APP源码V1.7官方版源码.zip (2009个子文件)
android_debug.apk 32.67MB
.babelrc 143B
test.bmp 0B
test.bmp 0B
app.13e227ce269394bb89eedb21bd4668a1.css 243KB
icon.css 70KB
index.css 69KB
main.css 53KB
uni.css 25KB
uni-nvue.css 2KB
Migration.template.php.dist 788B
Migration.template.php.dist 756B
phpunit.xml.dist 571B
phpunit.xml.dist 552B
Seed.template.php.dist 345B
Seed.template.php.dist 326B
.DS_Store 6KB
.editorconfig 171B
.eslintrc 106B
hiddeninput.exe 9KB
hiddeninput.exe 9KB
test.gif 233KB
test.gif 233KB
5ddb8f1a27ccf.gif 95KB
.gitignore 134B
.gitignore 123B
.gitignore 122B
.gitignore 57B
.gitignore 51B
.gitignore 47B
.gitignore 45B
.gitignore 43B
.gitignore 43B
.gitignore 43B
.gitignore 42B
.gitignore 39B
.gitignore 32B
.gitignore 31B
.gitignore 30B
.gitignore 29B
.gitignore 29B
.gitignore 28B
.gitignore 25B
.gitignore 20B
.gitignore 17B
.gitignore 16B
.gitignore 14B
.gitignore 14B
.gitignore 13B
.gitignore 13B
.gitignore 7B
.gitignore 6B
.htaccess 224B
.htaccess 216B
.htaccess 13B
.htaccess 13B
.htaccess 13B
.htaccess 13B
__uniapppicker.html 133KB
__uniappchooselocation.html 29KB
__uniappopenlocation.html 13KB
__uniappview.html 8KB
__uniappview.html 8KB
__uniappscan.html 7KB
__uniappview.html 4KB
template.h5.html 2KB
index.html 1KB
index.html 1KB
index.html 1011B
index.html 754B
__uniapptabbar.html 588B
403.html 543B
404.html 533B
403.html 517B
404.html 507B
favicon.ico 1KB
5dde23f28aff7.jpeg 22KB
5dde23b4d7c4d.jpeg 22KB
5dde23972887f.jpeg 22KB
5dde241ea6a79.jpeg 15KB
5dde23f281390.jpeg 15KB
5dde23973ae3a.jpeg 15KB
5dde239731975.jpeg 15KB
5dde23f277afa.jpeg 15KB
5dde26894284c.jpg 691KB
5dde27c6686d6.jpg 631KB
5dde26894d025.jpg 577KB
login-bg.95db843.jpg 321KB
5dc3c916113e9.jpg 259KB
5dde268918cba.jpg 192KB
5dc3c8f690861.jpg 180KB
5dc3c8e4d6740.jpg 168KB
5db7fb76e2055.jpg 166KB
5dde26892e40d.jpg 147KB
5dafbde85b8d8.jpg 142KB
5dafc09180fc0.jpg 142KB
5dafc3677327f.jpg 142KB
5dafc0d03b5dc.jpg 142KB
5dafc49d5bca8.jpg 142KB
5dc3c8d079219.jpg 141KB
共 2009 条
- 1
- 2
- 3
- 4
- 5
- 6
- 21
资源评论
Zirich
- 粉丝: 11
- 资源: 166
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功