Пример #1
0
 /**
  * Add a join statement.
  *
  * @todo  ignorar registros com deletedAt == true
  * @todo  validar a associação a partir do aluno: processos.ordensServico.servicoOrdemServico.itensServicoOrdemServico.itemServico
  *
  * @param $meta - getClassMetaData
  * @param $fk
  * @param $field
  * @param $alias
  * @param $defaultAlias
  */
 public function fkAssociation($meta, $fk, $field, $alias, $defaultAlias)
 {
     if ($association = $meta->associationMappings[$fk]) {
         if (!in_array($association['targetEntity'], $this->entitys)) {
             if (!empty($association['joinColumns'])) {
                 $condition = $this->getFullFieldName($association['fieldName'], $defaultAlias) . ' = ' . $this->getFullFieldName($association['joinColumns'][0]['referencedColumnName'], $alias);
                 $this->queryBuilder->leftJoin($association['targetEntity'], $alias, 'WITH', $condition);
                 $this->queryBuilder->andWhere($condition);
                 $this->entitys[] = $association['targetEntity'];
             } else {
                 //está buscando de um arrayCollection
                 $repository = explode('\\', $association['targetEntity']);
                 if (!$association['mappedBy']) {
                     if (!empty($association['joinTable'])) {
                         $this->manyToManyJoin($meta, $fk, $defaultAlias);
                         return $this->getFullFieldName($field, $fk);
                     }
                     return;
                 }
                 $meta = $this->getMetaRepository(end($repository));
                 return $this->fkArrayAssociation($meta, $association['mappedBy'], $field, lcfirst(end($repository)), $defaultAlias, $association['targetEntity']);
             }
         }
         //verifica se o campo existe
         if ($this->getPathRepository(ucfirst($fk))) {
             $meta = $this->getMetaRepository(ucfirst($fk));
         } else {
             //busca a entidade correta
             $metaAlias = $this->getFkMetaAlias($defaultAlias, $fk, $meta);
             $meta = $metaAlias['meta'];
             $alias = $metaAlias['alias'];
         }
         if (empty($meta->associationMappings[$field]) && empty($meta->fieldMappings[$field])) {
             return;
         } elseif (!empty($meta->associationMappings[$field]) && empty($meta->associationMappings[$field]['joinColumns'])) {
             return;
         }
         //retorna o campo
         return '(' . $this->getFullFieldName($field, $alias) . ') AS ' . $this->getFullFieldName($field, $alias, '_');
     }
 }