public function removeEntity(bool $flush = FALSE) { $this->repository->remove($this->entity, TRUE); if ($flush) { $this->repository->flush(); } }
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); }
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); } }
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); }
/** * @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; }
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."); } }