mirror of
https://gitee.com/fastadminnet/framework.git
synced 2026-07-07 15:12:48 +08:00
改进多对多关联
This commit is contained in:
@@ -2130,14 +2130,23 @@ class Query
|
|||||||
$this->field('*');
|
$this->field('*');
|
||||||
}
|
}
|
||||||
foreach ($relations as $key => $relation) {
|
foreach ($relations as $key => $relation) {
|
||||||
$closure = false;
|
$closure = $name = null;
|
||||||
if ($relation instanceof \Closure) {
|
if ($relation instanceof \Closure) {
|
||||||
$closure = $relation;
|
$closure = $relation;
|
||||||
$relation = $key;
|
$relation = $key;
|
||||||
|
} elseif (!is_int($key)) {
|
||||||
|
$name = $relation;
|
||||||
|
$relation = $key;
|
||||||
}
|
}
|
||||||
$relation = Loader::parseName($relation, 1, false);
|
$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;
|
return $this;
|
||||||
|
|||||||
@@ -360,10 +360,16 @@ class BelongsToMany extends Relation
|
|||||||
* 获取关联统计子查询
|
* 获取关联统计子查询
|
||||||
* @access public
|
* @access public
|
||||||
* @param \Closure $closure 闭包
|
* @param \Closure $closure 闭包
|
||||||
|
* @param string $name 统计数据别名
|
||||||
* @return string
|
* @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, [
|
return $this->belongsToManyQuery($this->foreignKey, $this->localKey, [
|
||||||
'pivot.' . $this->localKey => [
|
'pivot.' . $this->localKey => [
|
||||||
'exp',
|
'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
|
* @access public
|
||||||
|
|||||||
@@ -152,12 +152,16 @@ class HasMany extends Relation
|
|||||||
* 创建关联统计子查询
|
* 创建关联统计子查询
|
||||||
* @access public
|
* @access public
|
||||||
* @param \Closure $closure 闭包
|
* @param \Closure $closure 闭包
|
||||||
|
* @param string $name 统计数据别名
|
||||||
* @return string
|
* @return string
|
||||||
*/
|
*/
|
||||||
public function getRelationCountQuery($closure)
|
public function getRelationCountQuery($closure, &$name = null)
|
||||||
{
|
{
|
||||||
if ($closure) {
|
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();
|
$localKey = $this->localKey ?: $this->parent->getPk();
|
||||||
return $this->query->whereExp($this->foreignKey, '=' . $this->parent->getTable() . '.' . $localKey)->fetchSql()->count();
|
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)
|
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
|
* @access protected
|
||||||
|
|||||||
@@ -188,15 +188,19 @@ class MorphMany extends Relation
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 获取关联统计子查询
|
* 创建关联统计子查询
|
||||||
* @access public
|
* @access public
|
||||||
* @param \Closure $closure 闭包
|
* @param \Closure $closure 闭包
|
||||||
|
* @param string $name 统计数据别名
|
||||||
* @return string
|
* @return string
|
||||||
*/
|
*/
|
||||||
public function getRelationCountQuery($closure)
|
public function getRelationCountQuery($closure, &$name = null)
|
||||||
{
|
{
|
||||||
if ($closure) {
|
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([
|
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);
|
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;
|
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