private function fetchCounts(QueryBuilder $builder, array $values) { $sourceTable = $builder->getFromAlias(); $targetTable = QueryBuilderHelper::getAlias($this->joinTable); $builder = clone $builder; $builder->leftJoin($sourceTable, '%table', $targetTable, '%column = %column', $this->joinTable, "{$targetTable}.{$this->primaryKeyTo}", "{$sourceTable}." . $this->targetRepository->getMapper()->getStorageReflection()->getStoragePrimaryKey()[0]); $builder->addSelect('%column', "{$targetTable}.{$this->primaryKeyFrom}"); $builder->orderBy(NULL); if ($builder->hasLimitOffsetClause()) { $sqls = []; $args = []; foreach ($values as $value) { $build = clone $builder; $build->andWhere("%column = %any", $this->primaryKeyFrom, $value); $sqls[] = "SELECT %any AS %column, COUNT(*) AS [count] FROM (" . $build->getQuerySql() . ') [temp]'; $args[] = $value; $args[] = $this->primaryKeyFrom; $args = array_merge($args, $build->getQueryParameters()); } $sql = '(' . implode(') UNION ALL (', $sqls) . ')'; $result = $this->connection->queryArgs($sql, $args); } else { $builder->addSelect('COUNT(%column) as count', $this->primaryKeyTo); $builder->andWhere('%column IN %any', $this->primaryKeyFrom, $values); $builder->groupBy('%column', $this->primaryKeyFrom); $result = $this->connection->queryArgs($builder->getQuerySql(), $builder->getQueryParameters()); } $counts = []; foreach ($result as $row) { $counts[$row->{$this->primaryKeyFrom}] = $row->count; } return $counts; }
private function fetchCounts(QueryBuilder $builder, array $values) { $targetStoragePrimaryKey = $this->targetMapper->getStorageReflection()->getStoragePrimaryKey()[0]; $sourceTable = $builder->getFromAlias(); $builder = clone $builder; $builder->addSelect("{$sourceTable}.{$this->joinStorageKey}"); $builder->orderBy(NULL); if ($builder->hasLimitOffsetClause()) { $sqls = []; $args = []; foreach ($values as $value) { $build = clone $builder; $build->andWhere("{$sourceTable}.{$this->joinStorageKey} = %any", $value); $sqls[] = "SELECT {$value} as {$this->joinStorageKey}, COUNT(*) AS count FROM (" . $build->getQuerySql() . ') temp'; $args = array_merge($args, $build->getQueryParameters()); } $sql = '(' . implode(') UNION ALL (', $sqls) . ')'; $result = $this->connection->queryArgs($sql, $args); } else { $builder->addSelect("COUNT({$sourceTable}.{$targetStoragePrimaryKey}) AS count"); $builder->andWhere("{$sourceTable}.{$this->joinStorageKey} IN %any", $values); $builder->groupBy("{$sourceTable}.{$this->joinStorageKey}"); $result = $this->connection->queryArgs($builder->getQuerySql(), $builder->getQueryParameters()); } $counts = []; foreach ($result as $row) { $counts[$row->{$this->joinStorageKey}] = $row->count; } return $counts; }
protected function fetch(QueryBuilder $builder, $hasJoin, array $values, IEntityPreloadContainer $preloadContainer = NULL) { $values = array_values(array_unique(array_filter($values, function ($value) { return $value !== NULL; }))); if (count($values) === 0) { return new EntityContainer([], $preloadContainer); } $primaryKey = $this->targetRepository->getMapper()->getStorageReflection()->getStoragePrimaryKey()[0]; $builder->andWhere('%column IN %any', $primaryKey, $values); $builder->addSelect(($hasJoin ? 'DISTINCT ' : '') . '%table.*', $builder->getFromAlias()); $result = $this->connection->queryArgs($builder->getQuerySQL(), $builder->getQueryParameters()); $entities = []; while ($data = $result->fetch()) { $entity = $this->targetRepository->hydrateEntity($data->toArray()); $entities[$entity->getValue('id')] = $entity; } return new EntityContainer($entities, $preloadContainer); }
protected function processMySQLAutoupdate(IEntity $entity, array $args) { $this->connection->queryArgs($args); $primary = []; $id = (array) ($entity->isPersisted() ? $entity->getPersistedId() : $this->connection->getLastInsertedId()); foreach ($this->getStorageReflection()->getStoragePrimaryKey() as $key) { $primary[$key] = array_shift($id); } $row = $this->connection->query('SELECT %ex FROM %table WHERE %and', $this->getAutoupdateReselectExpression(), $this->getTableName(), $primary)->fetch(); $data = $this->getStorageReflection()->convertStorageToEntity($row->toArray()); $entity->fireEvent('onRefresh', [$data]); }
protected function execute() { $builder = clone $this->queryBuilder; $table = $builder->getFromAlias(); if (!$this->distinct) { $builder->select("[{$table}.*]"); } else { $builder->select("DISTINCT [{$table}.*]"); } $result = $this->connection->queryArgs($builder->getQuerySql(), $builder->getQueryParameters()); $this->result = []; while ($data = $result->fetch()) { $this->result[] = $this->repository->hydrateEntity($data->toArray()); } }