think\model\Relation::eagerlyResultSet PHP Метод

eagerlyResultSet() публичный Метод

预载入关联查询 返回数据集
public eagerlyResultSet ( array $resultSet, string $relation, string $class = '' ) : array
$resultSet array 数据集
$relation string 关联名
$class string 数据集对象名 为空表示数组
Результат array
    public function eagerlyResultSet($resultSet, $relation, $class = '')
    {
        /** @var array $relations */
        $relations = is_string($relation) ? explode(',', $relation) : $relation;
        foreach ($relations as $key => $relation) {
            $subRelation = '';
            $closure = false;
            if ($relation instanceof \Closure) {
                $closure = $relation;
                $relation = $key;
            }
            if (strpos($relation, '.')) {
                list($relation, $subRelation) = explode('.', $relation);
            }
            // 执行关联方法
            $model = $this->parent->{$relation}();
            // 获取关联信息
            $localKey = $this->localKey;
            $foreignKey = $this->foreignKey;
            switch ($this->type) {
                case self::HAS_ONE:
                case self::BELONGS_TO:
                    foreach ($resultSet as $result) {
                        // 模型关联组装
                        $this->match($this->model, $relation, $result);
                    }
                    break;
                case self::HAS_MANY:
                    $range = [];
                    foreach ($resultSet as $result) {
                        // 获取关联外键列表
                        if (isset($result->{$localKey})) {
                            $range[] = $result->{$localKey};
                        }
                    }
                    if (!empty($range)) {
                        $this->where[$foreignKey] = ['in', $range];
                        $data = $this->eagerlyOneToMany($model, [$foreignKey => ['in', $range]], $relation, $subRelation, $closure);
                        // 关联数据封装
                        foreach ($resultSet as $result) {
                            if (!isset($data[$result->{$localKey}])) {
                                $data[$result->{$localKey}] = [];
                            }
                            $result->setAttr($relation, $this->resultSetBuild($data[$result->{$localKey}], $class));
                        }
                    }
                    break;
                case self::BELONGS_TO_MANY:
                    $pk = $resultSet[0]->getPk();
                    $range = [];
                    foreach ($resultSet as $result) {
                        // 获取关联外键列表
                        if (isset($result->{$pk})) {
                            $range[] = $result->{$pk};
                        }
                    }
                    if (!empty($range)) {
                        // 查询关联数据
                        $data = $this->eagerlyManyToMany($model, ['pivot.' . $localKey => ['in', $range]], $relation, $subRelation);
                        // 关联数据封装
                        foreach ($resultSet as $result) {
                            if (!isset($data[$result->{$pk}])) {
                                $data[$result->{$pk}] = [];
                            }
                            $result->setAttr($relation, $this->resultSetBuild($data[$result->{$pk}], $class));
                        }
                    }
                    break;
            }
        }
        return $resultSet;
    }