/** * Add completeness joins to query builder * * @param string $completenessAlias the join alias * @param string $locale the locale * @param sting $scope the scope * * @return CompletenessJoin */ public function addJoins($completenessAlias, $locale, $scope) { $rootAlias = $this->qb->getRootAlias(); $localeAlias = $completenessAlias . 'Locale'; $channelAlias = $completenessAlias . 'Channel'; $rootEntity = current($this->qb->getRootEntities()); $completenessMapping = $this->qb->getEntityManager()->getClassMetadata($rootEntity)->getAssociationMapping('completenesses'); $completenessClass = $completenessMapping['targetEntity']; $this->qb->leftJoin('PimCatalogBundle:Locale', $localeAlias, 'WITH', $localeAlias . '.code = :cLocaleCode')->leftJoin('PimCatalogBundle:Channel', $channelAlias, 'WITH', $channelAlias . '.code = :cScopeCode')->leftJoin($completenessClass, $completenessAlias, 'WITH', $completenessAlias . '.locale = ' . $localeAlias . '.id AND ' . $completenessAlias . '.channel = ' . $channelAlias . '.id AND ' . $completenessAlias . '.product = ' . $rootAlias . '.id')->setParameter('cLocaleCode', $locale)->setParameter('cScopeCode', $scope); return $this; }
protected function resetBuilder() { $rootEntities = $this->qb->getRootEntities(); $this->qb = $this->qb->getEntityManager()->getRepository($rootEntities[0])->createQueryBuilder('x'); $this->joinAliases = []; $this->parametersMap = []; $this->orderBy = []; }
/** * Add completeness joins to query builder * * @param string $completenessAlias the join alias * @param string $locale the locale * @param string $scope the scope * * @return CompletenessJoin */ public function addJoins($completenessAlias, $locale, $scope) { $rootAlias = $this->qb->getRootAliases()[0]; $localeAlias = $completenessAlias . 'Locale'; $channelAlias = $completenessAlias . 'Channel'; $rootEntity = $this->qb->getRootEntities()[0]; $completenessMapping = $this->qb->getEntityManager()->getClassMetadata($rootEntity)->getAssociationMapping('completenesses'); $completenessClass = $completenessMapping['targetEntity']; $joinCondition = sprintf('%s.product = %s.id', $completenessAlias, $rootAlias); $this->qb->leftJoin('PimCatalogBundle:Channel', $channelAlias, 'WITH', $channelAlias . '.code = :cScopeCode')->setParameter('cScopeCode', $scope); $joinCondition .= sprintf(' AND %s.channel = %s.id', $completenessAlias, $channelAlias); if (null !== $locale) { $this->qb->leftJoin('PimCatalogBundle:Locale', $localeAlias, 'WITH', sprintf('%s.code = :%scLocaleCode', $localeAlias, $localeAlias))->setParameter($localeAlias . 'cLocaleCode', $locale); $joinCondition .= sprintf(' AND %s.locale = %s.id', $completenessAlias, $localeAlias); } $this->qb->leftJoin($completenessClass, $completenessAlias, 'WITH', $joinCondition); return $this; }
/** * @param QueryBuilder $queryBuilder * @param QueryBuilderTools $qbTools */ public function __construct(QueryBuilder $queryBuilder, QueryBuilderTools $qbTools) { // make sure 'from' DQL part is initialized for both original and optimized query builders $queryBuilder->getRootEntities(); $this->originalQueryBuilder = $queryBuilder; $this->qbTools = $qbTools; // initialize the query builder helper $this->qbTools->prepareFieldAliases($this->originalQueryBuilder->getDQLPart('select')); $this->qbTools->prepareJoinTablePaths($this->originalQueryBuilder->getDQLPart('join')); }
/** * Detects if the root entity has the given identifier. * * @param QueryBuilder $queryBuilder * @param ManagerRegistry $managerRegistry * @param bool $isForeign * * @return bool */ private static function hasRootEntityWithIdentifier(QueryBuilder $queryBuilder, ManagerRegistry $managerRegistry, bool $isForeign) : bool { foreach ($queryBuilder->getRootEntities() as $rootEntity) { $rootMetadata = $managerRegistry->getManagerForClass($rootEntity)->getClassMetadata($rootEntity); if ($isForeign ? $rootMetadata->isIdentifierComposite : $rootMetadata->containsForeignIdentifier) { return true; } } return false; }
/** * Determines whether the query builder has any root entity with foreign key identifier. * * @param QueryBuilder $queryBuilder * @param ManagerRegistry $managerRegistry * * @return bool */ public static function hasRootEntityWithForeignKeyIdentifier(QueryBuilder $queryBuilder, ManagerRegistry $managerRegistry) { foreach ($queryBuilder->getRootEntities() as $rootEntity) { $rootMetadata = $managerRegistry->getManagerForClass($rootEntity)->getClassMetadata($rootEntity); if ($rootMetadata->containsForeignIdentifier) { return true; } } return false; }
public function getAllClassesForQueryBuilder(QueryBuilder $queryBuilder) : array { $classes = []; $rootEntities = $queryBuilder->getRootEntities(); foreach ($rootEntities as $rootEntity) { $classes[$rootEntity] = $rootEntity; $metadata = $this->getClassMetadata($rootEntity); $this->addAssociationsTargetClasses($metadata, $classes); } return $classes; }
/** * Ensure that filtering applied and query builder wrapped in buffered iterator * if data source is query builder or just an entity name * * @param ContextInterface $context */ protected function ensureInitialized(ContextInterface $context) { if (null !== $this->qb) { if ($context->hasOption(self::ID_FILTER)) { $optionValue = $context->getOption(self::ID_FILTER); $em = $this->qb->getEntityManager(); $entityNames = $this->qb->getRootEntities(); $classMetadata = $em->getClassMetadata(reset($entityNames)); $identifier = $classMetadata->getSingleIdentifierFieldName(); if (is_array($optionValue)) { $this->qb->andWhere($this->qb->expr()->in('o.' . $identifier, ':id')); $this->qb->setParameter('id', $optionValue); } else { $this->qb->andWhere('o.' . $identifier . ' = :id'); } $this->qb->setParameter('id', $optionValue); } $this->setSourceIterator(new BufferedQueryResultIterator($this->qb)); } }
private function addJoinsToQueryBuilder($alias, QueryBuilder $qb, $className, $recursive = true) { foreach ($this->getEntityManager()->getClassMetadata($className)->getAssociationMappings() as $assoc) { if (in_array($assoc['targetEntity'], $qb->getRootEntities()) || $className === $assoc['targetEntity']) { continue; } $uniqueJoinAlias = $this->getUniqueAlias($assoc['targetEntity'], $qb); $qb->addSelect($uniqueJoinAlias)->leftJoin(sprintf('%s.%s', $alias, $assoc['fieldName']), $uniqueJoinAlias); if ($recursive) { $this->addJoinsToQueryBuilder($uniqueJoinAlias, $qb, $assoc['targetEntity']); } } }
/** * Defines default identifiers from query builder in order to optimize count queries. * * @return $this * * @throws \Doctrine\Common\Persistence\Mapping\MappingException */ public function setDefaultIdentifierFieldNames() { //Default identifier for table rows $rootEntity = $this->queryBuilder->getRootEntities()[0]; $metadata = $this->queryBuilder->getEntityManager()->getMetadataFactory()->getMetadataFor($rootEntity); $identifiers = array(); foreach ($metadata->getIdentifierFieldNames() as $identifierFieldName) { $identifiers[] = $this->getAlias() . '.' . $identifierFieldName; } $rootEntityIdentifier = implode(',', $identifiers); $this->setIdentifierFieldNames($rootEntityIdentifier ?: null); return $this; }
function it_adds_a_filter_on_a_field_in_the_query(QueryBuilder $qb, Expr $expr, EntityManager $em, ClassMetadata $cm, Expr\Comparison $comparison) { $qb->expr()->willReturn($expr); $qb->getRootAlias()->willReturn('p'); $qb->getRootEntities()->willReturn([]); $qb->getEntityManager()->willReturn($em); $em->getClassMetadata(false)->willReturn($cm); $comparison->__toString()->willReturn('filterCompleteness.ratio < 100'); $cm->getAssociationMapping('completenesses')->willReturn(['targetEntity' => 'test']); $expr->literal('100')->willReturn('100'); $expr->lt(Argument::any(), '100')->willReturn($comparison); $this->setQueryBuilder($qb); $qb->leftJoin('PimCatalogBundle:Locale', Argument::any(), 'WITH', Argument::any())->willReturn($qb); $qb->leftJoin('PimCatalogBundle:Channel', Argument::any(), 'WITH', Argument::any())->willReturn($qb); $qb->leftJoin('test', Argument::any(), 'WITH', Argument::any())->willReturn($qb); $qb->setParameter('cLocaleCode', Argument::any())->willReturn($qb); $qb->setParameter('cScopeCode', Argument::any())->willReturn($qb); $qb->andWhere('filterCompleteness.ratio < 100')->shouldBeCalled(); $this->addFieldFilter('completeness', '<', 100, 'en_US', 'mobile'); }
/** * Constructor. * * @param Query|QueryBuilder $query * A Doctrine ORM query or query builder. * @param boolean $fetchJoinCollection * Whether the query joins a collection (true by default). * @param boolean $cache * Use result cache (true by default). * @param boolean $count * Execute count query (true by default). */ public function __construct($query, $fetchJoinCollection = true, $cached = true, $count = true) { if ($count) { $countQuery = clone $query; $countQuery = $countQuery->select('count(e) as c')->setFirstResult(0)->setMaxResults(1)->getQuery(); $this->countQuery = $countQuery; } $q = $query; if ($cached) { $this->cache_prefix = ''; if ($query instanceof QueryBuilder) { $q = $query->getQuery(); $entities = $query->getRootEntities(); if ($entities) { $entity = $entities[0]; $this->cache_prefix = strtolower(substr(strrchr($entity, '\\'), 1) ?: $entity) . '-'; } } $q->useQueryCache(true)->useResultCache(true, 3600, $this->cache_prefix . md5($q->getDQL())); } parent::__construct($q, $fetchJoinCollection); }
/** * Joins with the authorizations and filters the results to keep only those authorized. * * @param QueryBuilder $qb * @param SecurityIdentityInterface $identity * @param string $action * @param string|null $entityClass Class name of the entity that is the resource in the query. * If omitted, it will be guessed from the SELECT. * @param string|null $entityAlias Alias of the entity that is the resource in the query. * If omitted, it will be guessed from the SELECT. * * @throws \RuntimeException The query builder has no "select" part */ public static function joinACL(QueryBuilder $qb, SecurityIdentityInterface $identity, $action, $entityClass = null, $entityAlias = null) { if ($entityClass === null) { $rootEntities = $qb->getRootEntities(); if (!isset($rootEntities[0])) { throw new \RuntimeException('The query builder has no "select" part'); } $entityClass = $rootEntities[0]; } if ($entityAlias === null) { $rootAliases = $qb->getRootAliases(); if (!isset($rootAliases[0])) { throw new \RuntimeException('The query builder has no "select" part'); } $entityAlias = $rootAliases[0]; } $qb->innerJoin('MyCLabs\\ACL\\Model\\Authorization', 'authorization', 'WITH', $entityAlias . '.id = authorization.entityId'); $qb->andWhere('authorization.entityClass = :acl_entity_class'); $qb->andWhere('authorization.securityIdentity = :acl_identity'); $qb->andWhere('authorization.actions.' . $action . ' = true'); $qb->setParameter('acl_identity', $identity); $qb->setParameter('acl_entity_class', $entityClass); }
/** * Gets the class metadata from a given join alias. * * @param string $alias * @param QueryBuilder $queryBuilder * @param ManagerRegistry $managerRegistry * * @return ClassMetadata */ public static function getClassMetadataFromJoinAlias(string $alias, QueryBuilder $queryBuilder, ManagerRegistry $managerRegistry) : ClassMetadata { $rootEntities = $queryBuilder->getRootEntities(); $rootAliases = $queryBuilder->getRootAliases(); $joinParts = $queryBuilder->getDQLPart('join'); $aliasMap = []; $targetAlias = $alias; foreach ($joinParts as $rootAlias => $joins) { $aliasMap[$rootAlias] = 'root'; foreach ($joins as $join) { $alias = self::getJoinAlias($join); $relationship = self::getJoinRelationship($join); $pos = strpos($relationship, '.'); $aliasMap[$alias] = ['parentAlias' => substr($relationship, 0, $pos), 'association' => substr($relationship, $pos + 1)]; } } $associationStack = []; $rootAlias = null; while (null === $rootAlias) { $mapping = $aliasMap[$targetAlias]; if ('root' === $mapping) { $rootAlias = $targetAlias; } else { $associationStack[] = $mapping['association']; $targetAlias = $mapping['parentAlias']; } } $rootEntity = $rootEntities[array_search($rootAlias, $rootAliases)]; $rootMetadata = $managerRegistry->getManagerForClass($rootEntity)->getClassMetadata($rootEntity); $metadata = $rootMetadata; while (null !== ($association = array_pop($associationStack))) { $associationClass = $metadata->getAssociationTargetClass($association); $metadata = $managerRegistry->getManagerForClass($associationClass)->getClassMetadata($associationClass); } return $metadata; }
/** * Get the results from the sql after adding the * * @param \Victoire\Bundle\BusinessEntityPageBundle\Entity\BusinessEntityPagePattern $containerEntity * @param QueryBuilder $itemsQueryBuilder * * @throws \Exception * * @return QueryBuilder The QB to list of objects */ public function buildWithSubQuery($containerEntity, QueryBuilder $itemsQueryBuilder) { //services $entityManager = $this->entityManager; //test the container entity if ($containerEntity === null) { throw new \Exception('The container entity parameter must not be null.'); } //verify that the object has the query trait $this->checkObjectHasQueryTrait($containerEntity); //get the query of the container entity $query = $containerEntity->getQuery(); if ($query !== '' && $query !== null) { $subQuery = $this->entityManager->createQueryBuilder()->select('item.id')->from($itemsQueryBuilder->getRootEntities()[0], 'item'); $itemsQueryBuilder->andWhere('main_item.id IN (' . $subQuery->getQuery()->getDql() . ' ' . $query . ')'); } $currentView = $this->currentView; // If the current page is a BEP, we parse all its properties and inject them as query parameters if ($currentView() && $currentView() instanceof BusinessEntityPage && null !== ($currentEntity = $currentView()->getBusinessEntity())) { // NEW $metadatas = $this->entityManager->getClassMetadata(get_class($currentEntity)); foreach ($metadatas->fieldMappings as $fieldName => $field) { if (strpos($query, ":" . $fieldName) !== false) { $itemsQueryBuilder->setParameter($fieldName, $metadatas->getFieldValue($currentEntity, $fieldName)); } } foreach ($metadatas->associationMappings as $fieldName => $field) { if (strpos($query, ":" . $fieldName) !== false) { $itemsQueryBuilder->setParameter($fieldName, $metadatas->getFieldValue($currentEntity, $fieldName)->getId()); } } if (strpos($query, ":currentEntity") !== false) { $itemsQueryBuilder->setParameter('currentEntity', $currentEntity->getId()); } } return $itemsQueryBuilder; }
/** * {@inheritdoc} */ public function isFilterable(QueryBuilder $qb) { $entities = $qb->getRootEntities(); if (empty($entities)) { return false; } foreach ($entities as $entity) { $extendedMeta = $this->extendedMetadataFactory->getExtendedMetadata($entity); if (!empty($extendedMeta['user'])) { return true; } } return false; }
/** * Get root entities config data * * @param QueryBuilder $query * @return array with root entities config */ protected function getRootIds(QueryBuilder $query) { $groupParts = $this->getGroupParts(); $rootIds = []; if (empty($groupParts)) { $rootIdentifiers = $query->getEntityManager()->getClassMetadata($query->getRootEntities()[0])->getIdentifier(); $rootAlias = $query->getRootAliases()[0]; foreach ($rootIdentifiers as $field) { $rootIds[] = ['fieldAlias' => $field, 'alias' => $field, 'entityAlias' => $rootAlias]; } } else { foreach ($groupParts as $groupPart) { if (strpos($groupPart, '.')) { list($rootAlias, $rootIdentifierPart) = explode('.', $groupPart); $rootIds[] = ['fieldAlias' => $rootIdentifierPart, 'entityAlias' => $rootAlias, 'alias' => $rootIdentifierPart]; } else { $selectParts = $this->masterQB->getDQLPart('select'); /** @var Select $selectPart */ foreach ($selectParts as $selectPart) { foreach ($selectPart->getParts() as $part) { if (preg_match('/^(.*)\\sas\\s(.*)$/i', $part, $matches)) { if (count($matches) == 3 && $groupPart == $matches[2]) { $rootIds[] = ['fieldAlias' => $matches[1], 'alias' => $matches[2]]; } } else { $rootIds[] = ['fieldAlias' => $groupPart, 'alias' => $groupPart]; } } } } } } return $rootIds; }
/** * Apply the ACL constraints to the specified query builder, using the permission definition * * @param QueryBuilder $queryBuilder The query builder * @param PermissionDefinition $permissionDef The permission definition * * @return Query */ public function apply(QueryBuilder $queryBuilder, PermissionDefinition $permissionDef) { $whereQueryParts = $queryBuilder->getDQLPart('where'); if (empty($whereQueryParts)) { $queryBuilder->where('1 = 1'); // this will help in cases where no where query is specified } $query = $this->cloneQuery($queryBuilder->getQuery()); $builder = new MaskBuilder(); foreach ($permissionDef->getPermissions() as $permission) { $mask = constant(get_class($builder) . '::MASK_' . strtoupper($permission)); $builder->add($mask); } $query->setHint('acl.mask', $builder->get()); $query->setHint(Query::HINT_CUSTOM_OUTPUT_WALKER, 'Kunstmaan\\AdminBundle\\Helper\\Security\\Acl\\AclWalker'); $rootEntity = $permissionDef->getEntity(); $rootAlias = $permissionDef->getAlias(); // If either alias or entity was not specified - use default from QueryBuilder if (empty($rootEntity) || empty($rootAlias)) { $rootEntities = $queryBuilder->getRootEntities(); $rootAliases = $queryBuilder->getRootAliases(); $rootEntity = $rootEntities[0]; $rootAlias = $rootAliases[0]; } $query->setHint('acl.root.entity', $rootEntity); $query->setHint('acl.extra.query', $this->getPermittedAclIdsSQLForUser($query)); $classMeta = $this->em->getClassMetadata($rootEntity); $entityRootTableName = $this->quoteStrategy->getTableName($classMeta, $this->em->getConnection()->getDatabasePlatform()); $query->setHint('acl.entityRootTableName', $entityRootTableName); $query->setHint('acl.entityRootTableDqlAlias', $rootAlias); return $query; }
/** * Adds filter by $entity DQL to the given query builder * * @param QueryBuilder $qb The query builder that is used to get the list of activities * @param string $entityClass The target entity class * @param mixed $entityId The target entity id * @param string|null $activityEntityClass This parameter should be specified * if the query has more than one root entity * * @throws \RuntimeException */ public function addFilterByTargetEntity(QueryBuilder $qb, $entityClass, $entityId, $activityEntityClass = null) { $activityEntityAlias = null; $rootEntities = $qb->getRootEntities(); if (empty($rootEntities)) { throw new \RuntimeException('The query must have at least one root entity.'); } if (empty($activityEntityClass)) { if (count($rootEntities) > 1) { throw new \RuntimeException('The $activityEntityClass must be specified if the query has several root entities.'); } $activityEntityClass = $rootEntities[0]; $activityEntityAlias = $qb->getRootAliases()[0]; } else { $normalizedActivityEntityClass = ClassUtils::getRealClass($this->entityClassResolver->getEntityClass($activityEntityClass)); foreach ($rootEntities as $i => $className) { $className = $this->entityClassResolver->getEntityClass($className); if ($className === $normalizedActivityEntityClass) { $activityEntityAlias = $qb->getRootAliases()[$i]; break; } } if (empty($activityEntityAlias)) { throw new \RuntimeException(sprintf('The "%s" must be the root entity.', $activityEntityClass)); } } $activityIdentifierFieldName = $this->doctrineHelper->getSingleEntityIdentifierFieldName($activityEntityClass); $targetIdentifierFieldName = $this->doctrineHelper->getSingleEntityIdentifierFieldName($entityClass); $filterQuery = $qb->getEntityManager()->createQueryBuilder()->select(sprintf('filterActivityEntity.%s', $activityIdentifierFieldName))->from($activityEntityClass, 'filterActivityEntity')->innerJoin(sprintf('filterActivityEntity.%s', ExtendHelper::buildAssociationName($entityClass, ActivityScope::ASSOCIATION_KIND)), 'filterTargetEntity')->where(sprintf('filterTargetEntity.%s = :targetEntityId', $targetIdentifierFieldName))->getQuery(); $qb->andWhere($qb->expr()->in(sprintf('%s.%s', $activityEntityAlias, $activityIdentifierFieldName), $filterQuery->getDQL()))->setParameter('targetEntityId', $entityId); }
/** * Gets the root entity of the filter criteria. * * <code> * $filter = $service->buildFilterCriteria('u') * * $filter->getRootEntity(); // 'User' * </code> * * @return string */ public function getRootEntity() { $rootEntities = $this->queryBuilder->getRootEntities(); return $rootEntities[0]; }
private function buildFieldNameMap(QueryBuilder $qb, Search $search) { $fieldNameMap = []; $entityFieldNames = $qb->getEntityManager()->getClassMetadata($qb->getRootEntities()[0])->getFieldNames(); $currentJoins = []; $fieldNames = []; foreach ($search->getFieldFilters() as $fieldFilter) { $fieldNames[] = $fieldFilter->getField(); } foreach ($search->getOrderBy() as $orderBy) { $fieldNames[] = $orderBy->getField(); } $fieldNames = array_unique($fieldNames); foreach ($fieldNames as $fieldName) { $pieces = explode('.', $fieldName); if (in_array($fieldName, $entityFieldNames) || count($pieces) == 1) { $fieldNameMap[$fieldName] = $qb->getRootAlias() . '.' . $fieldName; } else { $lastAlias = $qb->getRootAlias(); foreach ($pieces as $i => $piece) { if ($i == count($pieces) - 1) { $fieldNameMap[$fieldName] = $pieces[$i - 1] . '.' . $piece; } else { $currentJoin = $lastAlias . '.' . $piece; if (!in_array($currentJoin, $currentJoins)) { $qb->leftJoin($currentJoin, $piece); $currentJoins[] = $currentJoin; } $lastAlias = $piece; } } } } return $fieldNameMap; }
/** * @param int $index * @return ClassMetadata */ protected function getClassMetadata($index = 0) { $rootClasses = $this->qb->getRootEntities(); return $this->qb->getEntityManager()->getClassMetadata($rootClasses[$index]); }
/** * @param QueryBuilder $qb * * @return string * * @throws \RuntimeException */ public function getRootEntityClass(QueryBuilder $qb) { $entities = $qb->getRootEntities(); if (count($entities) !== 1) { if (count($entities) === 0) { throw new \RuntimeException('Cannot get root entity class. A query builder has no root entity.'); } else { throw new \RuntimeException('Cannot get root entity class. A query builder has more than one root entity.'); } } return $this->resolveEntityClass($entities[0]); }
/** * @param QueryBuilder $qb * @param string $alias * * @return null */ protected function getRootEntity(QueryBuilder $qb, $alias) { $entity = null; $rootAliases = $qb->getRootAliases(); for ($i = 0; $i < count($rootAliases); $i++) { if ($rootAliases[$i] === $alias) { $entity = $qb->getRootEntities()[$i]; break; } } return $entity; }
/** * Get the results from the sql after adding the. * * @param VictoireQueryInterface $containerEntity * @param QueryBuilder $itemsQueryBuilder * * @throws \Exception * * @return QueryBuilder The QB to list of objects */ public function buildWithSubQuery(VictoireQueryInterface $containerEntity, QueryBuilder $itemsQueryBuilder, EntityManager $em) { //get the query of the container entity $query = $containerEntity->getQuery(); if (method_exists($containerEntity, 'additionnalQueryPart')) { $query = $containerEntity->additionnalQueryPart(); } if ($query !== '' && $query !== null) { $subQuery = $em->createQueryBuilder()->select('item.id')->from($itemsQueryBuilder->getRootEntities()[0], 'item'); $itemsQueryBuilder->andWhere(sprintf('main_item.id IN (%s %s)', $subQuery->getQuery()->getDql(), $query)); } //Add ORDER BY if set if ($orderBy = json_decode($containerEntity->getOrderBy(), true)) { foreach ($orderBy as $addOrderBy) { $reflectionClass = new \ReflectionClass($itemsQueryBuilder->getRootEntities()[0]); $reflectionProperty = $reflectionClass->getProperty($addOrderBy['by']); //If ordering field is an association, treat it as a boolean if ($this->isAssociationField($reflectionProperty)) { $itemsQueryBuilder->addSelect('CASE WHEN main_item.' . $addOrderBy['by'] . ' IS NULL THEN 0 ELSE 1 END AS HIDDEN caseOrder'); $itemsQueryBuilder->addOrderBy('caseOrder', $addOrderBy['order']); } else { $itemsQueryBuilder->addOrderBy('main_item.' . $addOrderBy['by'], $addOrderBy['order']); } } } $currentView = $this->currentView; // If the current page is a BEP, we parse all its properties and inject them as query parameters if ($currentView() && $currentView() instanceof BusinessPage && null !== ($currentEntity = $currentView()->getBusinessEntity())) { // NEW $metadatas = $em->getClassMetadata(get_class($currentEntity)); foreach ($metadatas->fieldMappings as $fieldName => $field) { if (strpos($query, ':' . $fieldName) !== false) { $itemsQueryBuilder->setParameter($fieldName, $metadatas->getFieldValue($currentEntity, $fieldName)); } } foreach ($metadatas->associationMappings as $fieldName => $field) { if (strpos($query, ':' . $fieldName) !== false) { $itemsQueryBuilder->setParameter($fieldName, $metadatas->getFieldValue($currentEntity, $fieldName)->getId()); } } if (strpos($query, ':currentEntity') !== false) { $itemsQueryBuilder->setParameter('currentEntity', $currentEntity->getId()); } } elseif ($currentView() instanceof BusinessTemplate && strpos($query, ':currentEntity') !== false) { $itemsQueryBuilder->setParameter('currentEntity', $containerEntity->getEntity()->getId()); } if (strpos($query, ':currentUser') !== false && is_object($this->getCurrentUser())) { if (is_object($this->getCurrentUser())) { $itemsQueryBuilder->setParameter('currentUser', $this->getCurrentUser()->getId()); } else { throw new AccessDeniedException(); } } return $itemsQueryBuilder; }
/** * Get the results from the sql after adding the. * * @param mixed $containerEntity * @param QueryBuilder $itemsQueryBuilder * * @throws \Exception * * @return QueryBuilder The QB to list of objects */ public function buildWithSubQuery($containerEntity, QueryBuilder $itemsQueryBuilder, EntityManager $em) { //test the container entity if ($containerEntity === null) { throw new \Exception('The container entity parameter must not be null.'); } //verify that the object has the query trait //@todo please use an interface and cast with it in the method signature $this->checkObjectHasQueryTrait($containerEntity); //get the query of the container entity $query = $containerEntity->getQuery(); if (method_exists($containerEntity, 'additionnalQueryPart')) { $query = $containerEntity->additionnalQueryPart(); } if ($query !== '' && $query !== null) { $subQuery = $em->createQueryBuilder()->select('item.id')->from($itemsQueryBuilder->getRootEntities()[0], 'item'); $itemsQueryBuilder->andWhere('main_item.id IN (' . $subQuery->getQuery()->getDql() . ' ' . $query . ')'); } //Add ORDER BY if set if (method_exists($containerEntity, 'getOrderBy')) { $orderBy = json_decode($containerEntity->getOrderBy(), true); if ($orderBy) { foreach ($orderBy as $addOrderBy) { $reflectionClass = new \ReflectionClass($itemsQueryBuilder->getRootEntities()[0]); $reflectionProperty = $reflectionClass->getProperty($addOrderBy['by']); //If ordering field is an association, treat it as a boolean if ($this->isAssociationField($reflectionProperty)) { $itemsQueryBuilder->addSelect('CASE WHEN main_item.' . $addOrderBy['by'] . ' IS NULL THEN 0 ELSE 1 END AS HIDDEN caseOrder'); $itemsQueryBuilder->addOrderBy('caseOrder', $addOrderBy['order']); } else { $itemsQueryBuilder->addOrderBy('main_item.' . $addOrderBy['by'], $addOrderBy['order']); } } } } $currentView = $this->currentView; // If the current page is a BEP, we parse all its properties and inject them as query parameters if ($currentView() && $currentView() instanceof BusinessPage && null !== ($currentEntity = $currentView()->getBusinessEntity())) { // NEW $metadatas = $em->getClassMetadata(get_class($currentEntity)); foreach ($metadatas->fieldMappings as $fieldName => $field) { if (strpos($query, ':' . $fieldName) !== false) { $itemsQueryBuilder->setParameter($fieldName, $metadatas->getFieldValue($currentEntity, $fieldName)); } } foreach ($metadatas->associationMappings as $fieldName => $field) { if (strpos($query, ':' . $fieldName) !== false) { $itemsQueryBuilder->setParameter($fieldName, $metadatas->getFieldValue($currentEntity, $fieldName)->getId()); } } if (strpos($query, ':currentEntity') !== false) { $itemsQueryBuilder->setParameter('currentEntity', $currentEntity->getId()); } } return $itemsQueryBuilder; }
/** * This will clone the original query and apply acl * * @param QueryBuilder $queryBuilder Builder * @param array $permissions Permission mask * @param UserInterface $user User * * @return Query */ public function apply(QueryBuilder $queryBuilder, array $permissions = array("VIEW"), UserInterface $user = null) { $whereQueryParts = $queryBuilder->getDQLPart('where'); if (empty($whereQueryParts)) { $fromQueryParts = $queryBuilder->getDQLPart('from'); $firstFromQueryAlias = $fromQueryParts[0]->getAlias(); // this will help in cases where no where query is specified, // where query is required to walk in where clause $queryBuilder->where($firstFromQueryAlias . '.id IS NOT NULL'); } $query = $this->cloneQuery($queryBuilder->getQuery()); $builder = new MaskBuilder(); foreach ($permissions as $permission) { $mask = constant(get_class($builder) . '::MASK_' . strtoupper($permission)); $builder->add($mask); } $query->setHint('acl.mask', $builder->get()); $query->setHint(Query::HINT_CUSTOM_OUTPUT_WALKER, $this->aclWalkerClass); $entities = $queryBuilder->getRootEntities(); $query->setHint('acl.root.entities', $entities); $query->setHint('acl.extra.query', $this->getPermittedIdsACLSQLForUser($query, $queryBuilder, $user)); //$class = $this->getEntityManager()->getClassMetadata($entities[0]); //$entityRootTableName = $class->getQuotedTableName($this->getEntityManager()->getConnection()->getDatabasePlatform()); /** @var QuoteStrategy $quoteStrategy */ $quoteStrategy = $this->getEntityManager()->getConfiguration()->getQuoteStrategy(); $entityRootTableName = $quoteStrategy->getTableName($this->getEntityManager()->getClassMetadata($entities[0]), $this->getEntityManager()->getConnection()->getDatabasePlatform()); $entityRootAliases = $queryBuilder->getRootAliases(); $entityRootAlias = $entityRootAliases[0]; $query->setHint('acl.entityRootTableName', $entityRootTableName); $query->setHint('acl.entityRootTableDqlAlias', $entityRootAlias); return $query; }
/** * @author Franlin Rivero Grcia <*****@*****.**> * @param EntityManager $em * @param QueryBuilder $qb * @param array $filters Arreglo asociativo campo => valor * @param ResultType $resultType * @param type $order * @param type $page * @return array */ public static function filterRecordsQB(EntityManager $em, QueryBuilder $qb, $filters = array(), $order = null, $resultType = ResultType::ObjectType) { $rootEntityA = $qb->getRootEntities(); $rootEntity = $rootEntityA[0]; $meta = $em->getClassMetadata($rootEntity); // $meta = $em->getClassMetadata($class); $alias = UtilRepository2::createAlias($rootEntity); $fields = $meta->getFieldNames(); $asoc = $meta->getAssociationNames(); // if(count($qb->getDQLPart('groupBy')) > 0) // foreach($fields as $field ) // $qb->addGroupBy($alias.".$field"); UtilRepository2::fieldFilter($alias, $filters, $fields, $asoc, $meta, $qb); UtilRepository2::putOrder($alias, $fields, $order, $qb); // print $qb->getQuery()->getSQL()."<br/>"; // die; return UtilRepository2::doResult($qb, $resultType, $alias); }