增加关联统计功能

This commit is contained in:
thinkphp
2016-12-22 12:22:44 +08:00
parent 83c13a741c
commit cd57d97f36
5 changed files with 108 additions and 1 deletions

View File

@@ -1308,6 +1308,29 @@ abstract class Model implements \JsonSerializable, \ArrayAccess
}
}
/**
* 关联统计
* @access public
* @param Model $result 数据对象
* @param string|array $relation 关联名
* @return void
*/
public function relationCount(&$result, $relation)
{
$relations = is_string($relation) ? explode(',', $relation) : $relation;
foreach ($relations as $key => $relation) {
$closure = false;
if ($relation instanceof \Closure) {
$closure = $relation;
$relation = $key;
}
$relation = Loader::parseName($relation, 1, false);
$count = $this->$relation()->relationCount($result, $closure);
$result->setAttr(Loader::parseName($relation) . '_count', $count);
}
}
/**
* HAS ONE 关联定义
* @access public

View File

@@ -1666,6 +1666,18 @@ class Query
return $this;
}
/**
* 关联统计
* @access public
* @param string|array $relation 关联方法名
* @return $this
*/
public function withCount($relation)
{
$this->options['with_count'] = $relation;
return $this;
}
/**
* 关联预加载中 获取关联指定字段值
* example:
@@ -1997,6 +2009,10 @@ class Query
if (!empty($options['relation'])) {
$result->relationQuery($options['relation']);
}
// 关联统计
if (!empty($options['with_count'])) {
$result->relationCount($result, $options['with_count']);
}
$resultSet[$key] = $result;
}
if (!empty($options['with'])) {
@@ -2095,10 +2111,14 @@ class Query
if (!empty($options['relation'])) {
$data->relationQuery($options['relation']);
}
// 预载入查询
if (!empty($options['with'])) {
// 预载入
$data->eagerlyResult($data, $options['with'], is_object($result) ? get_class($result) : '');
}
// 关联统计
if (!empty($options['with_count'])) {
$data->relationCount($data, $options['with_count']);
}
}
} elseif (!empty($options['fail'])) {
$this->throwNotFound($options);

View File

@@ -145,6 +145,26 @@ class BelongsToMany extends Relation
}
}
/**
* 关联统计
* @access public
* @param Model $result 数据对象
* @param \Closure $closure 闭包
* @return integer
*/
public function relationCount($result, $closure)
{
$localKey = $this->localKey;
$foreignKey = $this->foreignKey;
$pk = $result->getPk();
$count = 0;
if (isset($result->$pk)) {
$pk = $result->$pk;
$count = $this->belongsToManyQuery($this->middle, $foreignKey, $localKey, ['pivot.' . $localKey => $pk])->count();
}
return $count;
}
/**
* 多对多 关联模型预查询
* @access public

View File

@@ -113,6 +113,27 @@ class HasMany extends Relation
}
}
/**
* 关联统计
* @access public
* @param Model $result 数据对象
* @param \Closure $closure 闭包
* @return integer
*/
public function relationCount($result, $closure)
{
$localKey = $this->localKey;
$foreignKey = $this->foreignKey;
$count = 0;
if (isset($result->$localKey)) {
if ($closure) {
call_user_func_array($closure, [ & $this->query]);
}
$count = $this->query->where([$foreignKey => $result->$localKey])->count();
}
return $count;
}
/**
* 一对多 关联模型预查询
* @access public

View File

@@ -116,6 +116,29 @@ class MorphMany extends Relation
}
}
/**
* 关联统计
* @access public
* @param Model $result 数据对象
* @param \Closure $closure 闭包
* @return integer
*/
public function relationCount($result, $closure)
{
$morphType = $this->morphType;
$morphKey = $this->morphKey;
$type = $this->type;
$pk = $result->getPk();
$count = 0;
if (isset($result->$pk)) {
if ($closure) {
call_user_func_array($closure, [ & $this->query]);
}
$count = $this->query->where([$morphKey => $result->$pk, $morphType => $type])->count();
}
return $count;
}
/**
* 多态一对多 关联模型预查询
* @access public