mirror of
https://gitee.com/fastadminnet/framework.git
synced 2026-07-07 07:12:47 +08:00
增加关联统计功能
This commit is contained in:
@@ -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 关联定义
|
* HAS ONE 关联定义
|
||||||
* @access public
|
* @access public
|
||||||
|
|||||||
@@ -1666,6 +1666,18 @@ class Query
|
|||||||
return $this;
|
return $this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 关联统计
|
||||||
|
* @access public
|
||||||
|
* @param string|array $relation 关联方法名
|
||||||
|
* @return $this
|
||||||
|
*/
|
||||||
|
public function withCount($relation)
|
||||||
|
{
|
||||||
|
$this->options['with_count'] = $relation;
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 关联预加载中 获取关联指定字段值
|
* 关联预加载中 获取关联指定字段值
|
||||||
* example:
|
* example:
|
||||||
@@ -1997,6 +2009,10 @@ class Query
|
|||||||
if (!empty($options['relation'])) {
|
if (!empty($options['relation'])) {
|
||||||
$result->relationQuery($options['relation']);
|
$result->relationQuery($options['relation']);
|
||||||
}
|
}
|
||||||
|
// 关联统计
|
||||||
|
if (!empty($options['with_count'])) {
|
||||||
|
$result->relationCount($result, $options['with_count']);
|
||||||
|
}
|
||||||
$resultSet[$key] = $result;
|
$resultSet[$key] = $result;
|
||||||
}
|
}
|
||||||
if (!empty($options['with'])) {
|
if (!empty($options['with'])) {
|
||||||
@@ -2095,10 +2111,14 @@ class Query
|
|||||||
if (!empty($options['relation'])) {
|
if (!empty($options['relation'])) {
|
||||||
$data->relationQuery($options['relation']);
|
$data->relationQuery($options['relation']);
|
||||||
}
|
}
|
||||||
|
// 预载入查询
|
||||||
if (!empty($options['with'])) {
|
if (!empty($options['with'])) {
|
||||||
// 预载入
|
|
||||||
$data->eagerlyResult($data, $options['with'], is_object($result) ? get_class($result) : '');
|
$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'])) {
|
} elseif (!empty($options['fail'])) {
|
||||||
$this->throwNotFound($options);
|
$this->throwNotFound($options);
|
||||||
|
|||||||
@@ -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
|
* @access public
|
||||||
|
|||||||
@@ -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
|
* @access public
|
||||||
|
|||||||
@@ -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
|
* @access public
|
||||||
|
|||||||
Reference in New Issue
Block a user