mirror of
https://gitee.com/fastadminnet/framework.git
synced 2026-07-01 20:52:48 +08:00
改进多对多关联
This commit is contained in:
@@ -2130,14 +2130,23 @@ class Query
|
||||
$this->field('*');
|
||||
}
|
||||
foreach ($relations as $key => $relation) {
|
||||
$closure = false;
|
||||
$closure = $name = null;
|
||||
if ($relation instanceof \Closure) {
|
||||
$closure = $relation;
|
||||
$relation = $key;
|
||||
} elseif (!is_int($key)) {
|
||||
$name = $relation;
|
||||
$relation = $key;
|
||||
}
|
||||
$relation = Loader::parseName($relation, 1, false);
|
||||
$count = '(' . $this->model->$relation()->getRelationCountQuery($closure) . ')';
|
||||
$this->field([$count => Loader::parseName($relation) . '_count']);
|
||||
|
||||
$count = '(' . $this->model->$relation()->getRelationCountQuery($closure, $name) . ')';
|
||||
|
||||
if (empty($name)) {
|
||||
$name = Loader::parseName($relation) . '_count';
|
||||
}
|
||||
|
||||
$this->field([$count => $name]);
|
||||
}
|
||||
}
|
||||
return $this;
|
||||
|
||||
@@ -360,10 +360,16 @@ class BelongsToMany extends Relation
|
||||
* 获取关联统计子查询
|
||||
* @access public
|
||||
* @param \Closure $closure 闭包
|
||||
* @param string $name 统计数据别名
|
||||
* @return string
|
||||
*/
|
||||
public function getRelationCountQuery($closure)
|
||||
public function getRelationCountQuery($closure, &$name = null)
|
||||
{
|
||||
$return = call_user_func_array($closure, [ & $this->query]);
|
||||
if ($return && is_string($return)) {
|
||||
$name = $return;
|
||||
}
|
||||
|
||||
return $this->belongsToManyQuery($this->foreignKey, $this->localKey, [
|
||||
'pivot.' . $this->localKey => [
|
||||
'exp',
|
||||
@@ -513,6 +519,30 @@ class BelongsToMany extends Relation
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 判断是否存在关联数据
|
||||
* @access public
|
||||
* @param mixed $data 数据 可以使用关联模型对象 或者 关联对象的主键
|
||||
* @return Pivot
|
||||
* @throws Exception
|
||||
*/
|
||||
public function attached($data)
|
||||
{
|
||||
if ($data instanceof Model) {
|
||||
// 根据关联表主键直接写入中间表
|
||||
$relationFk = $data->getPk();
|
||||
$id = $data->$relationFk;
|
||||
} else {
|
||||
$id = $data;
|
||||
}
|
||||
|
||||
$pk = $this->parent->getPk();
|
||||
|
||||
$pivot = $this->pivot->where($this->localKey, $this->parent->$pk)->where($this->foreignKey, $id)->find();
|
||||
|
||||
return $pivot ?: false;
|
||||
}
|
||||
|
||||
/**
|
||||
* 解除关联的一个中间表数据
|
||||
* @access public
|
||||
|
||||
@@ -152,12 +152,16 @@ class HasMany extends Relation
|
||||
* 创建关联统计子查询
|
||||
* @access public
|
||||
* @param \Closure $closure 闭包
|
||||
* @param string $name 统计数据别名
|
||||
* @return string
|
||||
*/
|
||||
public function getRelationCountQuery($closure)
|
||||
public function getRelationCountQuery($closure, &$name = null)
|
||||
{
|
||||
if ($closure) {
|
||||
call_user_func_array($closure, [ & $this->query]);
|
||||
$return = call_user_func_array($closure, [ & $this->query]);
|
||||
if ($return && is_string($return)) {
|
||||
$name = $return;
|
||||
}
|
||||
}
|
||||
$localKey = $this->localKey ?: $this->parent->getPk();
|
||||
return $this->query->whereExp($this->foreignKey, '=' . $this->parent->getTable() . '.' . $localKey)->fetchSql()->count();
|
||||
|
||||
@@ -120,6 +120,18 @@ class HasManyThrough extends Relation
|
||||
public function relationCount($result, $closure)
|
||||
{}
|
||||
|
||||
/**
|
||||
* 创建关联统计子查询
|
||||
* @access public
|
||||
* @param \Closure $closure 闭包
|
||||
* @param string $name 统计数据别名
|
||||
* @return string
|
||||
*/
|
||||
public function getRelationCountQuery($closure, &$name = null)
|
||||
{
|
||||
throw new Exception('relation not support: withCount');
|
||||
}
|
||||
|
||||
/**
|
||||
* 执行基础查询(进执行一次)
|
||||
* @access protected
|
||||
|
||||
@@ -188,15 +188,19 @@ class MorphMany extends Relation
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取关联统计子查询
|
||||
* 创建关联统计子查询
|
||||
* @access public
|
||||
* @param \Closure $closure 闭包
|
||||
* @param string $name 统计数据别名
|
||||
* @return string
|
||||
*/
|
||||
public function getRelationCountQuery($closure)
|
||||
public function getRelationCountQuery($closure, &$name = null)
|
||||
{
|
||||
if ($closure) {
|
||||
call_user_func_array($closure, [ & $this->query]);
|
||||
$return = call_user_func_array($closure, [ & $this->query]);
|
||||
if ($return && is_string($return)) {
|
||||
$name = $return;
|
||||
}
|
||||
}
|
||||
|
||||
return $this->query->where([
|
||||
|
||||
@@ -227,4 +227,15 @@ class MorphOne extends Relation
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 创建关联统计子查询
|
||||
* @access public
|
||||
* @param \Closure $closure 闭包
|
||||
* @param string $name 统计数据别名
|
||||
* @return string
|
||||
*/
|
||||
public function getRelationCountQuery($closure, &$name = null)
|
||||
{
|
||||
throw new Exception('relation not support: withCount');
|
||||
}
|
||||
}
|
||||
|
||||
@@ -285,4 +285,15 @@ class MorphTo extends Relation
|
||||
return $this->parent->setRelation($this->relation, null);
|
||||
}
|
||||
|
||||
/**
|
||||
* 创建关联统计子查询
|
||||
* @access public
|
||||
* @param \Closure $closure 闭包
|
||||
* @param string $name 统计数据别名
|
||||
* @return string
|
||||
*/
|
||||
public function getRelationCountQuery($closure, &$name = null)
|
||||
{
|
||||
throw new Exception('relation not support: withCount');
|
||||
}
|
||||
}
|
||||
|
||||
@@ -323,4 +323,15 @@ abstract class OneToOne extends Relation
|
||||
return $data;
|
||||
}
|
||||
|
||||
/**
|
||||
* 创建关联统计子查询
|
||||
* @access public
|
||||
* @param \Closure $closure 闭包
|
||||
* @param string $name 统计数据别名
|
||||
* @return string
|
||||
*/
|
||||
public function getRelationCountQuery($closure, &$name = null)
|
||||
{
|
||||
throw new Exception('relation not support: withCount');
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user