/**
  * {@inheritdoc}
  */
 public function loadChoicesForValues(array $values, $value = null)
 {
     // Performance optimization
     // Also prevents the generation of "WHERE id IN ()" queries through the
     // object loader. At least with MySQL and on the development machine
     // this was tested on, no exception was thrown for such invalid
     // statements, consequently no test fails when this code is removed.
     // https://github.com/symfony/symfony/pull/8981#issuecomment-24230557
     if (empty($values)) {
         return array();
     }
     // Optimize performance in case we have an object loader and
     // a single-field identifier
     $optimize = null === $value || is_array($value) && $this->idReader === $value[0];
     if ($optimize && !$this->choiceList && $this->objectLoader && $this->idReader->isSingleId()) {
         $unorderedObjects = $this->objectLoader->getEntitiesByIds($this->idReader->getIdField(), $values);
         $objectsById = array();
         $objects = array();
         // Maintain order and indices from the given $values
         // An alternative approach to the following loop is to add the
         // "INDEX BY" clause to the Doctrine query in the loader,
         // but I'm not sure whether that's doable in a generic fashion.
         foreach ($unorderedObjects as $object) {
             $objectsById[(string) $this->idReader->getIdValue($object)] = $object;
         }
         foreach ($values as $i => $id) {
             if (isset($objectsById[$id])) {
                 $objects[$i] = $objectsById[$id];
             }
         }
         return $objects;
     }
     return $this->loadChoiceList($value)->getChoicesForValues($values);
 }
 /**
  * {@inheritdoc}
  */
 public function loadChoicesForValues(array $values, $value = null)
 {
     // Performance optimization
     if (empty($values)) {
         return array();
     }
     $unorderedObjects = $this->objectLoader->getEntitiesByIds($this->idReader->getIdField(), $values);
     $objectsById = array();
     $objects = array();
     foreach ($unorderedObjects as $object) {
         $objectsById[$this->idReader->getIdValue($object)] = $object;
     }
     foreach ($values as $i => $id) {
         if (isset($objectsById[$id])) {
             $objects[$i] = $objectsById[$id];
         } elseif ($this->isAllowAdd()) {
             $objects[$i] = $id;
         }
     }
     return $objects;
 }
예제 #3
0
 /**
  * Returns the entities corresponding to the given values.
  *
  * @param array $values
  *
  * @return array
  *
  * @see Symfony\Component\Form\Extension\Core\ChoiceList\ChoiceListInterface
  */
 public function getChoicesForValues(array $values)
 {
     if (!$this->loaded) {
         // Optimize performance in case we have an entity loader and
         // a single-field identifier
         if (count($this->identifier) === 1 && $this->entityLoader) {
             return $this->entityLoader->getEntitiesByIds(current($this->identifier), $values);
         }
         $this->load();
     }
     return parent::getChoicesForValues($values);
 }
예제 #4
0
 /**
  * Returns the entities corresponding to the given values.
  *
  * @param array $values
  *
  * @return array
  *
  * @see Symfony\Component\Form\Extension\Core\ChoiceList\ChoiceListInterface
  */
 public function getChoicesForValues(array $values)
 {
     // Performance optimization
     // Also prevents the generation of "WHERE id IN ()" queries through the
     // entity loader. At least with MySQL and on the development machine
     // this was tested on, no exception was thrown for such invalid
     // statements, consequently no test fails when this code is removed.
     // https://github.com/symfony/symfony/pull/8981#issuecomment-24230557
     if (empty($values)) {
         return array();
     }
     if (!$this->loaded) {
         // Optimize performance in case we have an entity loader and
         // a single-field identifier
         if ($this->idAsValue && $this->entityLoader) {
             $unorderedEntities = $this->entityLoader->getEntitiesByIds($this->idField, $values);
             $entitiesByValue = array();
             $entities = array();
             // Maintain order and indices from the given $values
             // An alternative approach to the following loop is to add the
             // "INDEX BY" clause to the Doctrine query in the loader,
             // but I'm not sure whether that's doable in a generic fashion.
             foreach ($unorderedEntities as $entity) {
                 $value = $this->fixValue(current($this->getIdentifierValues($entity)));
                 $entitiesByValue[$value] = $entity;
             }
             foreach ($values as $i => $value) {
                 if (isset($entitiesByValue[$value])) {
                     $entities[$i] = $entitiesByValue[$value];
                 }
             }
             return $entities;
         }
         $this->load();
     }
     return parent::getChoicesForValues($values);
 }