Пример #1
0
 /**
  * @return Doctrine\ORM\QueryBuilder
  */
 protected function getQueryBuilder()
 {
     if (!isset($this->queryBuilder)) {
         $qb = $this->repository->createQueryBuilder('entity');
         /* Überblick:
               wir bauen hier sowas wie das hier:
               
              $qb->where($qb->expr()->orX(
                  $qb->expr()->eq('tag.label', ':label'),
                      $qb->expr()->eq('tag.id', ':id')
                    ));
            
              dies wäre für den Fall das id der Primary Key von Tag ist und label ein UniqueConstraint für Tag ist
            */
         // wir stellen das where (für unten) zusammen
         $hydrateConditions = $qb->expr()->orX();
         try {
             // über den UniqueConstraint kann das Entity über eine AND() verknüpfung der keys des Constraints gefunden werden
             foreach ($this->repository->getUniqueConstraints() as $name => $uniqueConstraint) {
                 // hier könnten wir die UQs filtern (yagni)
                 $constraintCondition = $qb->expr()->andX();
                 foreach ($uniqueConstraint->getKeys() as $key) {
                     $constraintCondition->add($qb->expr()->eq(sprintf('entity.%s', $key), ':' . $key));
                     $this->queryFields[$key] = TRUE;
                 }
                 $hydrateConditions->add($constraintCondition);
             }
         } catch (NoUniqueConstraintException $e) {
             // ok
         }
         // der Primäry key ist durch :id findbar
         $hydrateConditions->add($qb->expr()->eq(sprintf('entity.%s', $pk = $this->getPrimaryKey()), ':id'));
         $this->queryFields[$pk] = TRUE;
         $qb->where($hydrateConditions);
         $this->queryBuilder = $qb;
     }
     return $this->queryBuilder;
 }