/** * Verifica se o grupo a ser excluído possui relacionamento com alguma unidade. * * @param Novosga\Context $context * @param Novosga\Model\SequencialModel $model */ protected function preDelete(Context $context, SequencialModel $model) { $query = $this->em()->createQuery("\n SELECT\n COUNT(e) as total\n FROM\n Novosga\\Model\\Unidade e\n INNER JOIN e.grupo g\n WHERE\n g.left >= :esquerda AND\n g.right <= :direita\n "); $query->setParameter('esquerda', $model->getLeft()); $query->setParameter('direita', $model->getRight()); $rs = $query->getSingleResult(); if ($rs['total'] > 0) { throw new \Exception(_('Esse grupo não pode ser excluído porque possui relacionamento com uma ou mais unidades.')); } }
protected function doDelete(Context $context, SequencialModel $model) { if ($model->getLeft() == 1) { throw new Exception(_('Não pode remover a raiz')); } try { $this->em()->beginTransaction(); $this->preDelete($context, $model); $className = get_class($model); // apagando os filhos $query = $this->em()->createQuery("DELETE FROM {$className} e WHERE e.left > :esquerda AND e.left < :direita"); $query->setParameter('esquerda', $model->getLeft()); $query->setParameter('direita', $model->getRight()); $query->execute(); // atualizando os tamanhos $tamanho = $model->getRight() - $model->getLeft() + 1; $query = $this->em()->createQuery("UPDATE {$className} e SET e.right = e.right - :tamanho WHERE e.right > :direita"); $query->setParameter('direita', $model->getRight()); $query->setParameter('tamanho', $tamanho); $query->execute(); // atualizando os tamanhos $query = $this->em()->createQuery("UPDATE {$className} e SET e.left = e.left - :tamanho WHERE e.left > :direita"); $query->setParameter('direita', $model->getRight()); $query->setParameter('tamanho', $tamanho); $query->execute(); $this->em()->remove($model); $this->em()->commit(); $this->em()->flush(); } catch (Exception $e) { $this->em()->rollback(); throw new Exception(sprintf(_('Erro ao apagar o registro: %s'), $e->getMessage())); } $this->postDelete($context, $model); }