/** * @param ChangeSet $changeset * @return bool|object */ public function applyChangeSet(ChangeSet $changeset) { $now = new \DateTime(); if ($changeset->getChangeAt() == null || $changeset->getChangeAt()->diff($now)->invert) { return false; } if ($changeset->getAction() == LoggableListener::ACTION_CREATE && $changeset->getObjectId() != null) { throw new \Exception("changeSet invalid {$changeset->getId()} create with object id"); } if ($changeset->getAction() != LoggableListener::ACTION_CREATE && $changeset->getObjectId() == null) { throw new \Exception("changeSet invalid {$changeset->getId()} no objectId found but no create Action"); } $data = $changeset->getData(); if ($changeset->getObjectId() == null) { //create a new one $r = new \ReflectionClass($changeset->getObjectClass()); $entity = $r->newInstanceWithoutConstructor(); } else { //edit $entity = $this->_em->find($changeset->getObjectClass(), $changeset->getObjectId()); } if ($changeset->getAction() == LoggableListener::ACTION_REMOVE) { //very rudimental remove... dont care about sitdeffects $this->_em->remove($entity); $this->_em->remove($changeset); $this->_em->flush(); return true; } $wrapped = new EntityWrapper($entity, $this->_em); $objectMeta = $wrapped->getMetadata(); foreach ($data as $field => $value) { if ($objectMeta->isSingleValuedAssociation($field)) { $mapping = $objectMeta->getAssociationMapping($field); $value = $value ? $this->_em->getReference($mapping['targetEntity'], $value) : null; } if (property_exists($changeset->getObjectClass(), $field)) { $wrapped->setPropertyValue($field, $value); } } if ($changeset->getObjectId() == null) { //MANY_TO_ONE create new one foreach ($objectMeta->getAssociationMappings() as $associationMapping) { if ($associationMapping['type'] != \Doctrine\ORM\Mapping\ClassMetadata::MANY_TO_ONE) { continue; } $one = $objectMeta->getReflectionProperty($associationMapping['fieldName'])->getValue($entity); if (array_key_exists('inversedBy', $associationMapping)) { $field = $associationMapping['inversedBy']; $associationMeta = $this->_em->getClassMetadata($associationMapping['targetEntity']); $associationMeta->getReflectionProperty($field)->getValue($one)->add($entity); } } } $object = $wrapped->getObject(); $object->removeScheduledChangeDate(); $this->_em->persist($object); $this->_em->remove($changeset); $this->_em->flush(); return $object; }
/** * Removes single node without touching children * * @internal * @param EntityWrapper $wrapped * @return void */ private function removeSingle(EntityWrapper $wrapped) { $meta = $this->getClassMetadata(); $config = $this->listener->getConfiguration($this->_em, $meta->name); $pk = $meta->getSingleIdentifierFieldName(); $nodeId = $wrapped->getIdentifier(); // prevent from deleting whole branch $dql = "UPDATE {$config['useObjectClass']} node"; $dql .= ' SET node.' . $config['left'] . ' = 0,'; $dql .= ' node.' . $config['right'] . ' = 0'; $dql .= ' WHERE node.' . $pk . ' = ' . $nodeId; $this->_em->createQuery($dql)->getSingleScalarResult(); // remove the node from database $dql = "DELETE {$config['useObjectClass']} node"; $dql .= " WHERE node.{$pk} = {$nodeId}"; $this->_em->createQuery($dql)->getSingleScalarResult(); // remove from identity map $this->_em->getUnitOfWork()->removeFromIdentityMap($wrapped->getObject()); }
/** * Removes single node without touching children * * @internal * * @param EntityWrapper $wrapped */ private function removeSingle(EntityWrapper $wrapped) { $meta = $this->getClassMetadata(); $config = $this->listener->getConfiguration($this->getEntityManager(), $meta->name); $pk = $meta->getSingleIdentifierFieldName(); $nodeId = $wrapped->getIdentifier(); // prevent from deleting whole branch $qb = $this->getQueryBuilder(); $qb->update($config['useObjectClass'], 'node')->set('node.' . $config['left'], 0)->set('node.' . $config['right'], 0); $qb->andWhere($qb->expr()->eq('node.' . $pk, ':id')); $qb->setParameter('id', $nodeId); $qb->getQuery()->getSingleScalarResult(); // remove the node from database $qb = $this->getQueryBuilder(); $qb->delete($config['useObjectClass'], 'node'); $qb->andWhere($qb->expr()->eq('node.' . $pk, ':id')); $qb->setParameter('id', $nodeId); $qb->getQuery()->getSingleScalarResult(); // remove from identity map $this->getEntityManager()->getUnitOfWork()->removeFromIdentityMap($wrapped->getObject()); }
/** * Removes single node without touching children * * @internal * @param EntityWrapper $wrapped * @return void */ private function removeSingle(EntityWrapper $wrapped) { $meta = $this->getClassMetadata(); $config = $this->listener->getConfiguration($this->_em, $meta->name); $pk = $meta->getSingleIdentifierFieldName(); $nodeId = $wrapped->getIdentifier(); // prevent from deleting whole branch $qb = $this->_em->createQueryBuilder(); $qb->update($config['useObjectClass'], 'node')->set('node.' . $config['left'], 0)->set('node.' . $config['right'], 0)->where($nodeId === null ? $qb->expr()->isNull('node.' . $pk) : $qb->expr()->eq('node.' . $pk, is_string($nodeId) ? $qb->expr()->literal($nodeId) : $nodeId)); $qb->getQuery()->getSingleScalarResult(); // remove the node from database $qb = $this->_em->createQueryBuilder(); $qb->delete($config['useObjectClass'], 'node')->where($nodeId === null ? $qb->expr()->isNull('node.' . $pk) : $qb->expr()->eq('node.' . $pk, is_string($nodeId) ? $qb->expr()->literal($nodeId) : $nodeId)); $qb->getQuery()->getSingleScalarResult(); // remove from identity map $this->_em->getUnitOfWork()->removeFromIdentityMap($wrapped->getObject()); }