/** * 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, '_'); } }