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 |
public function create($entity, array $params = []) { $entity = new $entity(); $repository = $this->model->getRepositoryForEntity($entity); $repository->attach($entity); $this->fill($entity, $params); return $entity; }
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); }
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; }
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; }
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; } } }
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; }
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; } } }
/** @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; }