getRepositoryForEntity() public method

Returns repository associated for entity type.
public getRepositoryForEntity ( Nextras\Orm\Entity\IEntity | string $entity ) : Nextras\Orm\Repository\IRepository
$entity Nextras\Orm\Entity\IEntity | string
return Nextras\Orm\Repository\IRepository
コード例 #1
0
 public function create($entity, array $params = [])
 {
     $entity = new $entity();
     $repository = $this->model->getRepositoryForEntity($entity);
     $repository->attach($entity);
     $this->fill($entity, $params);
     return $entity;
 }
コード例 #2
0
ファイル: Form.php プロジェクト: ytnuk/orm
 protected function createComponent($name)
 {
     if ($name instanceof Nextras\Orm\Entity\IEntity) {
         $class = rtrim($name->getMetadata()->getClassName(), 'a..zA..Z') . 'Form\\Container';
         return new $class($name, $this->model->getRepositoryForEntity($name));
     }
     return parent::createComponent($name);
 }
コード例 #3
0
ファイル: PersistenceHelper.php プロジェクト: nextras/orm
 protected static function visitEntity(IEntity $entity, IModel $model, $withCascade = true)
 {
     $entityHash = spl_object_hash($entity);
     if (isset(self::$outputQueue[$entityHash])) {
         if (self::$outputQueue[$entityHash] === true) {
             $cycle = [];
             $bt = debug_backtrace();
             foreach ($bt as $item) {
                 if ($item['function'] === 'getCascadeQueue') {
                     break;
                 } elseif ($item['function'] === 'addRelationshipToQueue') {
                     $cycle[] = get_class($item['args'][0]) . '::$' . $item['args'][1]->name;
                 }
             }
             throw new InvalidStateException('Persist cycle detected in ' . implode(' - ', $cycle) . '. Use manual two phase persist.');
         }
         return;
     }
     $repository = $model->getRepositoryForEntity($entity);
     $repository->attach($entity);
     $repository->doFireEvent($entity, 'onBeforePersist');
     if ($withCascade) {
         self::$outputQueue[$entityHash] = true;
         foreach ($entity->getMetadata()->getProperties() as $propertyMeta) {
             if ($propertyMeta->relationship !== null && $propertyMeta->relationship->cascade['persist']) {
                 self::addRelationshipToQueue($entity, $propertyMeta, $model);
             }
         }
         unset(self::$outputQueue[$entityHash]);
         // reenqueue
     }
     self::$outputQueue[$entityHash] = $entity;
 }
コード例 #4
0
ファイル: Repository.php プロジェクト: Zarganwar/orm
 public function persist(IEntity $entity, $recursive = TRUE)
 {
     $this->identityMap->check($entity);
     if (isset($this->isPersisting[spl_object_hash($entity)])) {
         return $entity;
     }
     $this->isPersisting[spl_object_hash($entity)] = TRUE;
     $this->attach($entity);
     $relationships = [];
     if ($recursive) {
         foreach ($entity->toArray(IEntity::TO_ARRAY_LOADED_RELATIONSHIP_AS_IS) as $k => $v) {
             if ($v instanceof IEntity) {
                 $this->model->getRepositoryForEntity($v)->persist($v);
             } elseif ($v instanceof IRelationshipCollection) {
                 $relationships[] = $v;
             }
         }
     }
     if ($entity->isModified()) {
         $id = $this->mapper->persist($entity);
         $entity->fireEvent('onPersist', [$id]);
     }
     foreach ($relationships as $relationship) {
         $relationship->persist($recursive);
     }
     unset($this->isPersisting[spl_object_hash($entity)]);
     return $entity;
 }
コード例 #5
0
 public static function getCascadeQueue($entity, IModel $model, &$queue = [])
 {
     $entityHash = spl_object_hash($entity);
     if (isset($queue[$entityHash])) {
         return;
     }
     $repository = $model->getRepositoryForEntity($entity);
     $repository->attach($entity);
     $repository->doFireEvent($entity, 'onBeforePersist');
     list($pre, $post) = static::getLoadedRelationships($entity);
     foreach ($pre as $value) {
         if ($value instanceof IEntity) {
             static::getCascadeQueue($value, $model, $queue);
         } elseif ($value instanceof IRelationshipCollection) {
             foreach ($value->getEntitiesForPersistance() as $subValue) {
                 static::getCascadeQueue($subValue, $model, $queue);
             }
             $queue[spl_object_hash($value)] = $value;
         }
     }
     $queue[$entityHash] = $entity;
     foreach ($post as $value) {
         if ($value instanceof IEntity) {
             static::getCascadeQueue($value, $model, $queue);
         } elseif ($value instanceof IRelationshipCollection) {
             foreach ($value->getEntitiesForPersistance() as $subValue) {
                 static::getCascadeQueue($subValue, $model, $queue);
             }
             $queue[spl_object_hash($value)] = $value;
         }
     }
 }
コード例 #6
0
ファイル: Container.php プロジェクト: ytnuk/translation
 protected function createComponentTranslates(Nextras\Orm\Entity\Reflection\PropertyMetadata $metadata) : Nette\Forms\Container
 {
     $translates = $this->addContainer($metadata->name);
     $localeRepository = $this->model->getRepositoryForEntity(Ytnuk\Translation\Locale\Entity::class);
     self::$locales ?: (self::$locales = $localeRepository->findAll()->fetchPairs(current($localeRepository->getEntityMetadata()->getPrimaryKey())));
     $collection = array_combine(array_map(function (Ytnuk\Translation\Translate\Entity $entity) {
         return $entity->getRawValue('locale');
     }, $collection = iterator_to_array($this->entity->getValue($metadata->name))), $collection);
     array_walk(self::$locales, function (Ytnuk\Translation\Locale\Entity $locale) use($translates, $collection) {
         $translate = $collection[$locale->id] ?? new Ytnuk\Translation\Translate\Entity();
         $translates->addComponent($component = $this->form->createComponent($translate), $locale->id);
         if ($component instanceof Nette\Forms\Container) {
             $component->setCurrentGroup($translates->getCurrentGroup());
             $value = $component['value'];
             if ($value instanceof Nette\Forms\Controls\BaseControl) {
                 $value->caption = NULL;
                 $value->setRequired(FALSE);
             }
             unset($component['locale']);
             $component->addHidden('locale', $locale->id)->setOption('entity', $locale);
         }
     });
     $parent = $this->lookup(parent::class, FALSE);
     if ($parent instanceof parent) {
         $translates->getCurrentGroup()->setOption('label', $parent->formatPropertyLabel($parent->getMetadata()->getProperty($this->getName())));
         if (!$parent->getMetadata()->getProperty($this->name)->isNullable && ($containers = iterator_to_array($translates->getComponents(FALSE, Nette\Forms\Container::class)))) {
             foreach ($containers as $key => $container) {
                 $value = $container['value'] ?? NULL;
                 if ($value instanceof Nette\Forms\Controls\BaseControl) {
                     foreach (array_diff_key($containers, array_flip([$key])) as $sibling) {
                         $value = $value->addConditionOn($sibling['value'], ~Nette\Forms\Form::FILLED);
                     }
                     $value->setRequired();
                 }
             }
         }
     }
     return $translates;
 }
コード例 #7
0
ファイル: RemovalHelper.php プロジェクト: nextras/orm
 public static function getCascadeQueueAndSetNulls(IEntity $entity, IModel $model, $withCascade, &$queuePersist, &$queueRemove)
 {
     $entityHash = spl_object_hash($entity);
     if (isset($queueRemove[$entityHash])) {
         return;
     }
     $repository = $model->getRepositoryForEntity($entity);
     $repository->attach($entity);
     $repository->doFireEvent($entity, 'onBeforeRemove');
     list($pre, $post, $nulls) = static::getRelationships($entity);
     $prePersist = [];
     static::setNulls($entity, $nulls, $model, $prePersist);
     if (!$withCascade) {
         $queueRemove[$entityHash] = $entity;
         return;
     }
     foreach ($prePersist as $value) {
         $queuePersist[spl_object_hash($value)] = $value;
     }
     foreach ($pre as $value) {
         if ($value instanceof IEntity) {
             static::getCascadeQueueAndSetNulls($value, $model, true, $queuePersist, $queueRemove);
         } elseif ($value instanceof IRelationshipCollection) {
             foreach ($value->getIterator() as $subValue) {
                 static::getCascadeQueueAndSetNulls($subValue, $model, true, $queuePersist, $queueRemove);
             }
             $queuePersist[spl_object_hash($value)] = $value;
         }
     }
     $queueRemove[$entityHash] = $entity;
     unset($queuePersist[$entityHash]);
     foreach ($post as $value) {
         if ($value instanceof IEntity) {
             static::getCascadeQueueAndSetNulls($value, $model, true, $queuePersist, $queueRemove);
         } elseif ($value instanceof IRelationshipCollection) {
             foreach ($value->getIterator() as $subValue) {
                 static::getCascadeQueueAndSetNulls($subValue, $model, true, $queuePersist, $queueRemove);
             }
             $queuePersist[spl_object_hash($value)] = $value;
         }
     }
 }
コード例 #8
0
ファイル: Repository.php プロジェクト: Vyki/orm
 /** @inheritdoc */
 public function persist(IEntity $entity, $recursive = TRUE, &$queue = NULL)
 {
     $this->identityMap->check($entity);
     $entityHash = spl_object_hash($entity);
     if (isset($queue[$entityHash]) && $queue[$entityHash] === TRUE) {
         return $entity;
     }
     $isRunner = $queue === NULL;
     if ($isRunner) {
         $queue = [];
     }
     $queue[$entityHash] = TRUE;
     try {
         $this->attach($entity);
         $isPersisted = $entity->isPersisted();
         $this->fireEvent($entity, 'onBeforePersist');
         $this->fireEvent($entity, $isPersisted ? 'onBeforeUpdate' : 'onBeforeInsert');
         $isModified = $entity->isModified();
         if ($recursive) {
             list($prePersist, $postPersist) = PersistanceHelper::getLoadedRelationships($entity);
             foreach ($prePersist as $value) {
                 $this->model->getRepositoryForEntity($value)->persist($value, $recursive, $queue);
             }
         }
         if ($isModified) {
             if ($isPersisted) {
                 // id can change (composite key)
                 $this->identityMap->remove($entity->getPersistedId());
             }
             $id = $this->mapper->persist($entity);
             $entity->fireEvent('onPersist', [$id]);
             $this->identityMap->add($entity);
             $this->entitiesToFlush[0][] = $entity;
         }
         if ($recursive) {
             foreach ($postPersist as $postPersistValue) {
                 $hash = spl_object_hash($postPersistValue);
                 if (!isset($queue[$hash])) {
                     $queue[$hash] = $postPersistValue;
                 }
             }
             if ($isRunner) {
                 reset($queue);
                 while ($value = current($queue)) {
                     $hash = key($queue);
                     next($queue);
                     if ($value === TRUE) {
                         continue;
                     }
                     if ($value instanceof IEntity) {
                         $this->model->getRepositoryForEntity($value)->persist($value, $recursive, $queue);
                     } elseif ($value instanceof IRelationshipCollection) {
                         $value->persist($recursive, $queue);
                     }
                     $queue[$hash] = TRUE;
                 }
             }
         }
         if ($isModified) {
             $this->fireEvent($entity, $isPersisted ? 'onAfterUpdate' : 'onAfterInsert');
             $this->fireEvent($entity, 'onAfterPersist');
         }
     } catch (\Exception $e) {
     }
     // finally workaround
     if ($isRunner) {
         $queue = NULL;
     }
     if (isset($e)) {
         throw $e;
     }
     return $entity;
 }