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);
 }
Exemple #4
0
 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());
     }
 }