/**
* 删除记录
* @access public
* @param mixed $data 主键列表 支持闭包查询条件
* @return integer 成功删除的记录数
*/
public static function destroy($data)// 删除记录
{
$model = new static();// 获取继承者ID
$query = $model->db();// 获取 数据库 操作
if (is_array($data) && key($data) !== 0) {// 如果是数组 并且 key 不等于0
$query->where($data);// where 条件进行设置
$data = null;// 赋值为空
} elseif ($data instanceof \Closure) {//如果是个匿名函数
call_user_func_array($data, [ & $query]);// 调用 $data 这样的匿名函数,传入 $query参数
$data = null;// 清空传入的参数
} elseif (is_null($data)) {// 如果传入参数 为空
return 0;//直接返回0
}
$resultSet = $query->select($data);// 获得结果集
$count = 0;// 清空条目
if ($resultSet) {// 获取结果集【对象】
foreach ($resultSet as $data) {// 遍历 新函数
$result = $data->delete();// 删除
$count += $result;// 累加
}
}
return $count;// 返回结果
}
/**
* 命名范围
* @access public
* @param string|array|Closure $name 命名范围名称 逗号分隔
* @param mixed ...$params 参数调用
* @return Model
*/
public static function scope($name)
{
if ($name instanceof Query) {// 如果是查询 实例化
return $name;
}
$model = new static();// 实例自己 的 model
$params = func_get_args();//获取传入的参数
$params[0] = $model->db();// 初始化 数据库连接
if ($name instanceof \Closure) {//闭包
call_user_func_array($name, $params);//调用函数 传递参数
} elseif (is_string($name)) {// 字符串
$name = explode(',', $name);
}
if (is_array($name)) {
foreach ($name as $scope) {// 多个函数调用
$method = 'scope' . trim($scope);
if (method_exists($model, $method)) {
call_user_func_array([$model, $method], $params);// 类 函数 参数
}
}
}
return $model;// 返回 model
}
/**
* 设置是否使用全局查询范围
* @param bool $use 是否启用全局查询范围
* @access public
* @return Model
*/
public static function useGlobalScope($use)
{
$model = new static();// 好处是 静态的
static::$useGlobalScope = $use;// 是否
return $model;// 返回设置
}
/**
* 根据关联条件查询当前模型
* @access public
* @param string $relation 关联方法名
* @param string $operator 比较操作符
* @param integer $count 个数
* @param string $id 关联表的统计字段
* @return Model
*/
public static function has($relation, $operator = '>=', $count = 1, $id = '*')
{
$model = new static();// 静态实例化
$info = $model->$relation()->getRelationInfo();// 获取信息
$table = $info['model']::getTable();// 表名
switch ($info['type']) {// 不同的类型
case Relation::HAS_MANY://生成普通的 join 语句
return $model->db()->alias('a')
->join($table . ' b', 'a.' . $info['localKey'] . '=b.' . $info['foreignKey'], $info['joinType'])
->group('b.' . $info['foreignKey'])
->having('count(' . $id . ')' . $operator . $count);
case Relation::HAS_MANY_THROUGH:// 居然还有未完成函数,牛叉
// TODO
}
}
/**
* 根据关联条件查询当前模型
* @access public
* @param string $relation 关联方法名
* @param mixed $where 查询条件(数组或者闭包)
* @return Model
*/
public static function hasWhere($relation, $where = [])
{
$model = new static();
$info = $model->$relation()->getRelationInfo();// 关联信息
switch ($info['type']) {
case Relation::HAS_ONE:
case Relation::HAS_MANY:
$table = $info['model']::getTable();
if (is_array($where)) {
foreach ($where as $key => $val) {
if (false === strpos($key, '.')) {
$where['b.' . $key] = $val;
unset($where[$key]);
}
}
}
return $model->db()->alias('a')
->field('a.*')
->join($table . ' b', 'a.' . $info['localKey'] . '=b.' . $info['foreignKey'], $info['joinType'])
->where($where);
case Relation::HAS_MANY_THROUGH:
// TODO
}
}// 同上 生成使用 has where 的关联查询
/**
* 解析模型的完整命名空间
* @access public
* @param string $model 模型名(或者完整类名)
* @return string
*/
protected function parseModel($model)
{
if (false === strpos($model, '\\')) {
$path = explode('\\', get_called_class());// 应该是有一些特殊的用法
array_pop($path);
array_push($path, Loader::parseName($model, 1));
$model = implode('\\', $path);
}// 获取完整的 命名空间
return $model;
}
/**
* 查询当前模型的关联数据
* @access public
* @param string|array $relations 关联名
* @return $this
*/
public function relationQuery($relations)
{
if (is_string($relations)) {// 关系型查询
$relations = explode(',', $relations);// 查询 explode
}
$this->relation();// relation 关系
foreach ($relations as $relation) {// relations as
$this->data[$relation] = $this->relation->getRelation($relation);
}// 关系 导入
return $this;
}
/**
* 预载入关联查询 返回数据集
* @access public
* @param array $resultSet 数据集
* @param string $relation 关联名
* @return array
*/
public function eagerlyResultSet($resultSet, $relation)
{
return $this->relation()->eagerlyResultSet($resultSet, $relation);
}// 预载入关联查询 返回数据集合
// 返回关联 结果集
转载于:https://blog.51cto.com/jingshanls/1881796