3735 lines
104 KiB
PHP
Executable File
3735 lines
104 KiB
PHP
Executable File
<?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\Collection;
|
||
use think\Container;
|
||
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\Collection as ModelCollection;
|
||
use think\model\Relation;
|
||
use think\model\relation\OneToOne;
|
||
use think\Paginator;
|
||
|
||
class Query
|
||
{
|
||
/**
|
||
* 当前数据库连接对象
|
||
* @var Connection
|
||
*/
|
||
protected $connection;
|
||
|
||
/**
|
||
* 当前模型对象
|
||
* @var Model
|
||
*/
|
||
protected $model;
|
||
|
||
/**
|
||
* 当前数据表名称(不含前缀)
|
||
* @var string
|
||
*/
|
||
protected $name = '';
|
||
|
||
/**
|
||
* 当前数据表主键
|
||
* @var string|array
|
||
*/
|
||
protected $pk;
|
||
|
||
/**
|
||
* 当前数据表前缀
|
||
* @var string
|
||
*/
|
||
protected $prefix = '';
|
||
|
||
/**
|
||
* 当前查询参数
|
||
* @var array
|
||
*/
|
||
protected $options = [];
|
||
|
||
/**
|
||
* 当前参数绑定
|
||
* @var array
|
||
*/
|
||
protected $bind = [];
|
||
|
||
/**
|
||
* 事件回调
|
||
* @var array
|
||
*/
|
||
private static $event = [];
|
||
|
||
/**
|
||
* 扩展查询方法
|
||
* @var array
|
||
*/
|
||
private static $extend = [];
|
||
|
||
/**
|
||
* 读取主库的表
|
||
* @var array
|
||
*/
|
||
protected static $readMaster = [];
|
||
|
||
/**
|
||
* 日期查询表达式
|
||
* @var array
|
||
*/
|
||
protected $timeRule = [
|
||
'today' => ['today', 'tomorrow'],
|
||
'yesterday' => ['yesterday', 'today'],
|
||
'week' => ['this week 00:00:00', 'next week 00:00:00'],
|
||
'last week' => ['last week 00:00:00', 'this week 00:00:00'],
|
||
'month' => ['first Day of this month 00:00:00', 'first Day of next month 00:00:00'],
|
||
'last month' => ['first Day of last month 00:00:00', 'first Day of this month 00:00:00'],
|
||
'year' => ['this year 1/1', 'next year 1/1'],
|
||
'last year' => ['last year 1/1', 'this year 1/1'],
|
||
];
|
||
|
||
/**
|
||
* 日期查询快捷定义
|
||
* @var array
|
||
*/
|
||
protected $timeExp = ['d' => 'today', 'w' => 'week', 'm' => 'month', 'y' => 'year'];
|
||
|
||
/**
|
||
* 架构函数
|
||
* @access public
|
||
*/
|
||
public function __construct(Connection $connection = null)
|
||
{
|
||
if (is_null($connection)) {
|
||
$this->connection = Db::connect();
|
||
} else {
|
||
$this->connection = $connection;
|
||
}
|
||
|
||
$this->prefix = $this->connection->getConfig('prefix');
|
||
}
|
||
|
||
/**
|
||
* 创建一个新的查询对象
|
||
* @access public
|
||
* @return Query
|
||
*/
|
||
public function newQuery()
|
||
{
|
||
return new static($this->connection);
|
||
}
|
||
|
||
/**
|
||
* 利用__call方法实现一些特殊的Model方法
|
||
* @access public
|
||
* @param string $method 方法名称
|
||
* @param array $args 调用参数
|
||
* @return mixed
|
||
* @throws DbException
|
||
* @throws Exception
|
||
*/
|
||
public function __call($method, $args)
|
||
{
|
||
if (isset(self::$extend[strtolower($method)])) {
|
||
// 调用扩展查询方法
|
||
array_unshift($args, $this);
|
||
|
||
return Container::getInstance()
|
||
->invoke(self::$extend[strtolower($method)], $args);
|
||
} elseif (strtolower(substr($method, 0, 5)) == 'getby') {
|
||
// 根据某个字段获取记录
|
||
$field = Loader::parseName(substr($method, 5));
|
||
return $this->where($field, '=', $args[0])< |