private function buildFromJoinsClause(Resource $resource) { $joinsClause = ''; if ($resource->hasRelationships()) { $relationships = $resource->getRelationships(); /** @var \FlyRRM\Mapping\Relationship $rel */ foreach ($relationships as $rel) { if ($rel->getType() === Relationship::TYPE_MANY_TO_ONE) { $referencedResource = $rel->getReferencedResource(); $mainResource = $rel->getMainResource(); $joinCondition = $mainResource->getResourceUniqueIdentifier() . '.' . $rel->getJoinColumn() . ' = ' . $referencedResource->getResourceUniqueIdentifier() . '.' . $referencedResource->getPrimaryKey(); $joinsClause .= ' left outer join ' . $referencedResource->getTable() . ' ' . $referencedResource->getResourceUniqueIdentifier() . ' on ' . $joinCondition . $this->buildFromJoinsClause($referencedResource); } } } return $joinsClause; }
private function hydrateResourceRelationships(Resource $resource, $row) { $rowRes = array(); /** @var \FlyRRM\Mapping\Relationship $r */ foreach ($resource->getRelationships() as $r) { $currentReferencedResource = $r->getReferencedResource(); if ($r->getType() === Relationship::TYPE_MANY_TO_ONE) { $rowRes[$currentReferencedResource->getAlias()] = $this->hydrateResourceFields($currentReferencedResource, $row); if ($currentReferencedResource->hasRelationships()) { $referencedsRes = $this->hydrateResourceRelationships($currentReferencedResource, $row); foreach ($referencedsRes as $refResKey => $refResValue) { $rowRes[$currentReferencedResource->getAlias()][$refResKey] = $refResValue; } } } if ($r->getType() === Relationship::TYPE_ONE_TO_MANY) { $rowRes = array_merge($rowRes, $this->hydrateOneToManySubResource($currentReferencedResource, $row)); } } return $rowRes; }