public function handle($criteria, $changes) { if (empty($criteria['limit'])) { $criteria['limit'] = 20; } if (!isset($criteria['offset']) && empty($criteria['page'])) { $criteria['page'] = 1; } if (empty($criteria['order'])) { $criteria['order'] = 'id DESC'; } $criteria = $this->repository->createCriteria($criteria); return $this->repository->findMany($criteria); }
/** * @param CriteriaInterface|array $criteria * @return EntityInterface[] */ public function findMany($criteria) { if (is_array($criteria)) { $criteria = $this->createCriteria($criteria); } if (empty($this->with)) { return $this->entityRepository->findMany($criteria); } /** @var Select $select */ $select = $criteria->getQuery(); $rows = $this->tableGateway->selectWith($select)->toArray(); if (empty($rows)) { return []; } $relatedEntityIds = []; foreach ($rows as $row) { foreach ($this->with as $relatedEntityName => $cascadeWith) { $relatedField = $this->getRelatedField($relatedEntityName); if (!array_key_exists($relatedField, $row)) { throw new \RuntimeException(get_class($this) . ": relation field {$relatedEntityName} not fetched"); } if (!isset($relatedEntityIds[$relatedEntityName])) { $relatedEntityIds[$relatedEntityName] = new ArrayObject(); } if (!in_array($row[$relatedField], (array) $relatedEntityIds[$relatedEntityName])) { $relatedEntityIds[$relatedEntityName]->append($row[$relatedField]); } } } $relatedEntities = []; foreach ($this->with as $relatedEntityName => $cascadeWith) { if (empty((array) $relatedEntityIds[$relatedEntityName])) { continue; } $criteria = $this->relatedRepository[$relatedEntityName]->createCriteria(['id.in' => (array) $relatedEntityIds[$relatedEntityName]]); $relatedEntities[$relatedEntityName] = $this->relatedRepository[$relatedEntityName]->findMany($criteria); } $entitiesArgs = []; foreach ($rows as &$row) { $entityArgs = ['data' => $this->mapper->fromTableRow($row)]; foreach ($this->relationsConfig as $entityName => $joinRule) { $relatedField = $this->getRelatedField($entityName); if (isset($relatedEntities[$entityName])) { if (isset($relatedEntities[$entityName][$row[$relatedField]])) { $entityArgs['aggregateItems'][] = $relatedEntities[$entityName][$row[$relatedField]]; } else { $entityArgs['aggregateItems'][] = null; } } else { $entityArgs['aggregateItems'][] = null; } } $entitiesArgs[] = $entityArgs; } $entities = $this->entityFactory->createCollection($entitiesArgs); $this->with = null; return $entities; }
/** * Execute the request * * @param MvcEvent $e * @return ListViewModelInterface */ public function onDispatch(MvcEvent $e) { if ($this->inputFilter) { $this->inputFilter->setData($this->query); if ($this->inputFilter->isValid()) { $validData = $this->inputFilter->getValues(); $criteria = $this->repository->createCriteria($validData); $collection = $this->repository->findMany($criteria); $this->viewModel->setCollection($collection); $this->viewModel->setInputData($validData); } else { $this->viewModel->setErrors($this->inputFilter->getMessages()); $this->viewModel->setInputData($this->query); } } else { $criteria = $this->repository->createCriteria($this->query); $collection = $this->repository->findMany($criteria); $this->viewModel->setCollection($collection); $this->viewModel->setInputData($this->query); } $e->setResult($this->viewModel); return $this->viewModel; }