/** * Ruft den qbFunction-Hook auf dem QueryBuilder auf und gibt entsprechend ein Result oder den QueryBuilder zurück * * der Hook kann unterbrechen, dass das Query direkt ausgeführt wird (return) oder bestimmen in welcher Form das Result zurückgegeben werden soll * * die qbFunction kann folgende Strings zurückgeben umn das Verhalten von deliverQuery zu steuern: * - return: gibt den QueryBuilder zurück * - result erstellt das Query und gibt das Ergebnis von query::getResult() zurück * - single erstellt das Query und gibt das Ergebnis von query::getSingleResult() zurück * - scalar erstellt das Query und gibt das Ergebnis von query::getScalarResult() zurück * * die qbFunction erhält nur einen Parameter dies ist der QueryBuilder * @param string $returnDefault ist qbFunction nicht gesetzt, wird dies als rückgabe Wert genommen (selbes format wie strings oben) * @return mixed */ public function deliverQuery($queryBuilder, $qbFunction, $returnDefault) { $qbFunction = $this->compileQBFunction($qbFunction); $return = $qbFunction($queryBuilder) ?: $returnDefault; if ($queryBuilder instanceof \Doctrine\ORM\QueryBuilder) { $query = $queryBuilder->getQuery(); } elseif ($queryBuilder instanceof \Doctrine\ORM\AbstractQuery) { $query = $queryBuilder; } else { throw new \Psc\Exception('Parameter 1 kann nur QueryBuilder oder Query sein.'); } try { if ($return === 'return') { return $queryBuilder; } elseif ($return === 'result') { return $query->getResult(); } elseif ($return === 'single') { return $query->getSingleResult(); } elseif ($return === 'scalar') { return $query->getScalarResult(); } elseif (mb_strtolower($return) === 'singleornull') { try { return $query->getSingleResult(); } catch (\Doctrine\ORM\NoResultException $e) { return NULL; } } else { return $query->getResult(); } } catch (\Doctrine\ORM\Query\QueryException $e) { throw new \Psc\Doctrine\QueryException(sprintf("%s \n\nDQL: '%s'", $e->getMessage(), $query->getDQL())); } catch (\Doctrine\ORM\NoResultException $e) { throw \Psc\Doctrine\EntityNotFoundException::fromQuery($query); } catch (\Doctrine\ORM\NonUniqueResultException $e) { throw \Psc\Doctrine\EntityNonUniqueResultException::fromQuery($query); } }