diff --git a/library/think/Model.php b/library/think/Model.php index 0491e551..14deb300 100644 --- a/library/think/Model.php +++ b/library/think/Model.php @@ -1281,8 +1281,15 @@ abstract class Model implements \JsonSerializable, \ArrayAccess $relations = explode(',', $relations); } - foreach ($relations as $relation) { - $this->data[$relation] = $this->$relation()->getRelation(); + foreach ($relations as $key => $relation) { + $closure = null; + if ($relation instanceof \Closure) { + // 支持闭包查询过滤关联条件 + $closure = $relation; + $relation = $key; + } + $method = Loader::parseName($relation, 1, false); + $this->data[$relation] = $this->$method()->getRelation($closure); } return $this; } diff --git a/library/think/model/relation/BelongsTo.php b/library/think/model/relation/BelongsTo.php index 8f26d033..a96d9028 100644 --- a/library/think/model/relation/BelongsTo.php +++ b/library/think/model/relation/BelongsTo.php @@ -38,12 +38,16 @@ class BelongsTo extends OneToOne /** * 延迟获取关联数据 + * @param \Closure $closure 闭包查询条件 * @access public */ - public function getRelation() + public function getRelation($closure = null) { $foreignKey = $this->foreignKey; $localKey = $this->localKey; + if ($closure) { + call_user_func_array($closure, [ & $this->query]); + } return $this->query->where($localKey, $this->parent->$foreignKey)->find(); } diff --git a/library/think/model/relation/BelongsToMany.php b/library/think/model/relation/BelongsToMany.php index 428620a2..25e1a078 100644 --- a/library/think/model/relation/BelongsToMany.php +++ b/library/think/model/relation/BelongsToMany.php @@ -46,13 +46,17 @@ class BelongsToMany extends Relation /** * 延迟获取关联数据 + * @param \Closure $closure 闭包查询条件 * @access public */ - public function getRelation() + public function getRelation($closure = null) { $foreignKey = $this->foreignKey; $localKey = $this->localKey; $middle = $this->middle; + if ($closure) { + call_user_func_array($closure, [ & $this->query]); + } // 关联查询 $pk = $this->parent->getPk(); $condition['pivot.' . $localKey] = $this->parent->$pk; diff --git a/library/think/model/relation/HasMany.php b/library/think/model/relation/HasMany.php index c9235bac..044cc88d 100644 --- a/library/think/model/relation/HasMany.php +++ b/library/think/model/relation/HasMany.php @@ -39,10 +39,14 @@ class HasMany extends Relation /** * 延迟获取关联数据 + * @param \Closure $closure 闭包查询条件 * @access public */ - public function getRelation() + public function getRelation($closure = null) { + if ($closure) { + call_user_func_array($closure, [ & $this->query]); + } return $this->select(); } diff --git a/library/think/model/relation/HasManyThrough.php b/library/think/model/relation/HasManyThrough.php index 2585f354..983daf22 100644 --- a/library/think/model/relation/HasManyThrough.php +++ b/library/think/model/relation/HasManyThrough.php @@ -49,10 +49,14 @@ class HasManyThrough extends Relation /** * 延迟获取关联数据 + * @param \Closure $closure 闭包查询条件 * @access public */ - public function getRelation() + public function getRelation($closure = null) { + if ($closure) { + call_user_func_array($closure, [ & $this->query]); + } return $this->select(); } diff --git a/library/think/model/relation/HasOne.php b/library/think/model/relation/HasOne.php index 41667e2a..05230922 100644 --- a/library/think/model/relation/HasOne.php +++ b/library/think/model/relation/HasOne.php @@ -38,13 +38,16 @@ class HasOne extends OneToOne /** * 延迟获取关联数据 + * @param \Closure $closure 闭包查询条件 * @access public */ - public function getRelation() + public function getRelation($colsure = null) { // 执行关联定义方法 $localKey = $this->localKey; - + if ($closure) { + call_user_func_array($closure, [ & $this->query]); + } // 判断关联类型执行查询 return $this->query->where($this->foreignKey, $this->parent->$localKey)->find(); } diff --git a/library/think/model/relation/MorphMany.php b/library/think/model/relation/MorphMany.php index abb32ebd..40c1f791 100644 --- a/library/think/model/relation/MorphMany.php +++ b/library/think/model/relation/MorphMany.php @@ -45,10 +45,14 @@ class MorphMany extends Relation /** * 延迟获取关联数据 + * @param \Closure $closure 闭包查询条件 * @access public */ - public function getRelation() + public function getRelation($closure = null) { + if ($closure) { + call_user_func_array($closure, [ & $this->query]); + } return $this->select(); } diff --git a/library/think/model/relation/MorphTo.php b/library/think/model/relation/MorphTo.php index e6676574..05017e8a 100644 --- a/library/think/model/relation/MorphTo.php +++ b/library/think/model/relation/MorphTo.php @@ -39,9 +39,10 @@ class MorphTo extends Relation /** * 延迟获取关联数据 + * @param \Closure $closure 闭包查询条件 * @access public */ - public function getRelation() + public function getRelation($closure = null) { $morphKey = $this->morphKey; $morphType = $this->morphType;