/** * Loads an entity by a list of field criteria. * * @param array $criteria The criteria by which to load the entity. * @param object $entity The entity to load the data into. If not specified, * a new entity is created. */ public function load(array $criteria, $entity = null) { $stmt = $this->_conn->prepare($this->_getSelectSingleEntitySql($criteria)); $stmt->execute(array_values($criteria)); $data = array(); foreach ($stmt->fetch(\PDO::FETCH_ASSOC) as $column => $value) { $fieldName = $this->_class->fieldNames[$column]; $data[$fieldName] = Type::getType($this->_class->getTypeOfField($fieldName))->convertToPHPValue($value); } $stmt->closeCursor(); if ($entity === null) { $entity = $this->_em->getUnitOfWork()->createEntity($this->_entityName, $data); } else { foreach ($data as $field => $value) { $this->_class->reflFields[$field]->setValue($entity, $value); } $id = array(); if ($this->_class->isIdentifierComposite) { foreach ($this->_class->identifier as $fieldName) { $id[] = $data[$fieldName]; } } else { $id = array($data[$this->_class->getSingleIdentifierFieldName()]); } $this->_em->getUnitOfWork()->registerManaged($entity, $id, $data); } if (!$this->_em->getConfiguration()->getAllowPartialObjects()) { foreach ($this->_class->associationMappings as $field => $assoc) { if ($assoc->isOneToOne()) { if ($assoc->isLazilyFetched()) { // Inject proxy $proxy = $this->_em->getProxyGenerator()->getAssociationProxy($entity, $assoc); $this->_class->reflFields[$field]->setValue($entity, $proxy); } else { //TODO: Eager fetch? } } else { // Inject collection $this->_class->reflFields[$field]->setValue($entity, new PersistentCollection($this->_em, $this->_em->getClassMetadata($assoc->targetEntityName))); } } } return $entity; }