Ejemplo n.º 1
0
 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);
         }
     }
 }