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;
}