Exemple #1
0
 public function removeEntity(bool $flush = FALSE)
 {
     $this->repository->remove($this->entity, TRUE);
     if ($flush) {
         $this->repository->flush();
     }
 }
Exemple #2
0
 protected function createComponentPagination() : Ytnuk\Orm\Pagination\Control
 {
     if (!$this->repository) {
         $this->error();
     }
     return new Ytnuk\Orm\Pagination\Control($this->repository->findAll(), self::ITEMS_PER_PAGE);
 }
 protected function fetch(SqlBuilder $builder, $hasJoin, array $values)
 {
     $primaryKey = $this->targetRepository->getMapper()->getStorageReflection()->getStoragePrimaryKey()[0];
     $builder->addWhere($primaryKey, $values);
     $builder->addSelect(($hasJoin ? 'DISTINCT ' : '') . $builder->getTableName() . '.*');
     $result = $this->context->queryArgs($builder->buildSelectQuery(), $builder->getParameters());
     $entities = [];
     while ($data = $result->fetch()) {
         $entity = $this->targetRepository->hydrateEntity((array) $data);
         $entities[$entity->id] = $entity;
     }
     return new EntityContainer($entities);
 }
 protected function getHelper()
 {
     if ($this->helper === NULL) {
         $this->helper = new ArrayCollectionHelper($this->repository->getModel(), $this->repository->getMapper());
     }
     return $this->helper;
 }
 protected function getParser()
 {
     if ($this->parser === NULL) {
         $this->parser = new QueryBuilderHelper($this->repository->getModel(), $this->repository->getMapper());
     }
     return $this->parser;
 }
 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 fetchByTwoPassStrategy(SqlBuilder $builder, array $values)
 {
     $builder = clone $builder;
     $builder->addSelect(":{$this->joinTable}({$this->primaryKeyTo}).{$this->primaryKeyTo}");
     $builder->addSelect(":{$this->joinTable}({$this->primaryKeyTo}).{$this->primaryKeyFrom}");
     if ($builder->getLimit() || $builder->getLimit() !== 1) {
         $sqls = $args = [];
         foreach ($values as $value) {
             $builderPart = clone $builder;
             $builderPart->addWhere(":{$this->joinTable}({$this->primaryKeyTo}).{$this->primaryKeyFrom}", $value);
             $sqls[] = $builderPart->buildSelectQuery();
             $args = array_merge($args, $builderPart->getParameters());
         }
         $query = '(' . implode(') UNION ALL (', $sqls) . ')';
         $result = $this->context->queryArgs($query, $args);
     } else {
         $builder->addWhere(":{$this->joinTable}({$this->primaryKeyTo}).{$this->primaryKeyFrom}", $values);
         $result = $this->context->queryArgs($builder->buildSelectQuery(), $builder->getParameters());
     }
     $values = [];
     foreach ($result->fetchAll() as $row) {
         $values[$row->{$this->primaryKeyTo}] = NULL;
     }
     if (count($values) === 0) {
         return new EntityIterator([]);
     }
     $entitiesResult = $this->targetRepository->findById(array_keys($values));
     $entitiesResult->getIterator();
     $entities = [];
     foreach ($result->fetchAll() as $row) {
         $entities[$row->{$this->primaryKeyFrom}][] = $this->targetRepository->getById($row->{$this->primaryKeyTo});
     }
     return new EntityIterator($entities);
 }
 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 #9
0
 protected function execute()
 {
     $builder = clone $this->builder;
     $builder->addSelect(($this->distinct ? 'DISTINCT ' : '') . $builder->getTableName() . '.*');
     $result = $this->context->queryArgs($builder->buildSelectQuery(), $builder->getParameters());
     $this->result = [];
     while ($data = $result->fetch()) {
         $this->result[] = $this->repository->hydrateEntity((array) $data);
     }
 }
Exemple #10
0
 protected function createComponentGrid() : Ytnuk\Grid\Control
 {
     $grid = new Ytnuk\Grid\Control(function (Nextras\Orm\Entity\IEntity $entity = NULL) {
         if (!$entity) {
             $entityClass = $this->repository->getEntityMetadata()->getClassName();
             $entity = new $entityClass();
         }
         $form = $this->form->create($entity);
         $form->onSubmit[] = function () {
             $this->redirect('this');
         };
         return $form;
     }, function (array $order, array $filter) {
         return $this->repository->findBy($this->prepareValues($filter))->orderBy($this->prepareValues($order))->fetchPairs(current($this->repository->getEntityMetadata()->getPrimaryKey()));
     });
     return $grid->setLink(function ($entity) {
         return $entity ? $this->getPresenter()->link('Presenter:edit', [current($this->repository->getEntityMetadata()->getPrimaryKey()) => $entity->id]) : $this->getPresenter()->link('Presenter:add');
     })->filterInputs(['this']);
 }
 private function queryAndFetchEntities($query, $args, IEntityPreloadContainer $preloadContainer = NULL)
 {
     $result = $this->connection->queryArgs($query, $args);
     $entities = [];
     while ($data = $result->fetch()) {
         $entity = $this->targetRepository->hydrateEntity($data->toArray());
         $entities[$entity->getRawValue($this->metadata->relationship->property)][] = $entity;
     }
     return new EntityIterator($entities, $preloadContainer);
 }
 private function queryAndFetchEntities($query, $args)
 {
     $result = $this->context->queryArgs($query, $args);
     $entities = [];
     while ($data = $result->fetch()) {
         $entity = $this->targetRepository->hydrateEntity((array) $data);
         $entities[$entity->getForeignKey($this->metadata->relationshipProperty)][] = $entity;
     }
     return new EntityIterator($entities);
 }
Exemple #13
0
 /**
  * @param  array
  * @return IEntity
  */
 protected function createEntity(array $data)
 {
     $data = $this->storageReflection->convertStorageToEntity($data);
     $entityClass = $this->repository->getEntityClassName($data);
     if (!isset($this->entityReflections[$entityClass])) {
         $this->entityReflections[$entityClass] = ClassType::from($entityClass);
     }
     $entity = $this->entityReflections[$entityClass]->newInstanceWithoutConstructor();
     $this->repository->attach($entity);
     $entity->fireEvent('onLoad', [$data]);
     return $entity;
 }
Exemple #14
0
 public function check(IEntity $entity)
 {
     if (!in_array(get_class($entity), $this->repository->getEntityClassNames(), TRUE)) {
         throw new InvalidArgumentException("Entity '" . get_class($entity) . "' is not accepted by '" . get_class($this->repository) . "' repository.");
     }
 }