protected function addIncludes(TokenSequencerInterface $query, $includeRelationships = null) { $includeRelationships = is_null($includeRelationships) ? $this->includeRelationshipsByDefault : $includeRelationships; if (!empty($includeRelationships)) { if (!is_array($includeRelationships) || isset($includeRelationships[0])) { $includeRelationships = ["this" => $includeRelationships]; } $allRelationships = ["this" => $this->entityMetadata->getRelationships()]; $relationships = []; $parents = []; // add all the relationship metadata we need into the allRelationships array foreach (array_keys($includeRelationships) as $alias) { if ($alias == "this") { // already added the subject entity's relationships continue; } foreach ($allRelationships as $subset) { if (!empty($subset[$alias])) { $relationshipEntity = $subset[$alias][EntityMetadata::METADATA_ENTITY]; $relationshipMetadata = $this->metadataProvider->getEntityMetadata($relationshipEntity); $allRelationships[$alias] = $relationshipMetadata->getRelationships(); break; } } } foreach ($includeRelationships as $alias => $includes) { if (empty($allRelationships[$alias])) { continue; } $thisRelationships = $allRelationships[$alias]; // if we have an array of includes, filter thisRelationships if (is_array($includes)) { $thisRelationships = array_intersect_key($allRelationships[$alias], array_flip($includes)); } // record the parent of each of the child aliases, so we can reference them when we include the entity foreach (array_keys($thisRelationships) as $childAlias) { $parents[$childAlias] = $alias; } // add thisRelationships to the final list $relationships = array_replace($relationships, $thisRelationships); } // get the metadata for each entity and include it on the query foreach ($relationships as $alias => $relationship) { $metadata = $this->metadataProvider->getEntityMetadata($relationship[EntityMetadata::METADATA_ENTITY]); if ($alias == $metadata->getEntity()) { $alias = ""; } $parent = ""; if (!empty($parents[$alias]) && $parents[$alias] != "this") { $parent = $parents[$alias]; } $query->includeEntity($metadata, $alias, $parent); } } }
/** * @dataProvider validRelationshipMetadataProvider * * @param array $metadata */ public function testValidRelationshipMetadata(array $metadata) { $metadata[EntityMetadata::METADATA_RELATIONSHIP_PROPERTY] = "collection"; $entity = "Silktide\\Reposition\\Metadata\\EntityMetadata"; $entityMetadata = new EntityMetadata("Silktide\\Reposition\\Metadata\\EntityMetadata"); $entityMetadata->addRelationshipMetadata($entity, $metadata); $entities = $entityMetadata->getRelationships(); $this->assertCount(1, $entities); $this->assertArrayHasKey($entity, $entities); }