usar symfony2 getrepository getdoctrine consultas como php doctrine doctrine2

php - symfony2 - ¿Puedo iterar sobre las propiedades de una Entidad en Doctrine2?



getdoctrine() (4)

Con toda probabilidad, las propiedades de su blog se declaran como protected . Es por eso que no puede iterar sobre ellos desde fuera de la Entidad misma.

Si está usando sus entidades de Blog en forma de solo lectura, y solo necesita acceder a las propiedades marcadas como @Columns (léase: no necesita llamar a ningún método en su entidad), puede considerar usar array-hydration . De esta forma, tratará con arreglos simples y la iteración de tipo $k=>$v funcionará bien.

De lo contrario, deberá crear algún tipo de método getValues ​​() en su clase de entidad. Esta podría ser una implementación simple que solo crea y ordena y la devuelve.

Finalmente, puede crear un getValues ​​() de propósito general como una función de utilidad que usa los metadatos de clase de la doctrina para descubrir qué columnas y entidad tienen y operar sobre esos datos. Una implementación simple como esta:

function getEntityColumnValues($entity,$em){ $cols = $em->getClassMetadata(get_class($entity))->getColumnNames(); $values = array(); foreach($cols as $col){ $getter = ''get''.ucfirst($col); $values[$col] = $entity->$getter(); } return $values; }

EDITAR : una versión más madura del método anterior parece estar disponible aquí . Todavía no jugué con eso, pero parece prometedor.

yo suelo

$myblogrepo = $this->_doctrine->getRepository(''Entities/Blog'')->findBy(array(''id'' => 12);

tengo acceso a través de

foreach($myblogrepo as $key =>$value){ echo $key . $value; }

¿cómo puedo obtener los nombres de los campos? pensé que la tecla => funcionaría pero imprimiría la clave como 0

así que pensé que esto funcionaría:

foreach($myblogrepo[0] as $key =>$value){ echo $key . $value; }

pero aún nada ..}


Esta es una implementación de una clase de serializador que también verifica si es una entidad de doctrina:

/** * JsonApiSerializer constructor. * @param EntityManagerInterface $em */ public function __construct(EntityManagerInterface $em) { $this->em = $em; } /** * @param $payLoad * @return string */ public function serialize($payLoad, $type) { $serializedPayload = new /stdClass(); $serializedPayload->data = new /stdClass(); $serializedPayload->data->type = $type; if ($this->isDoctrineEntity($payLoad)) { $this->addEntityColumnValues($serializedPayload, $payLoad); } return json_encode($serializedPayload); } private function isDoctrineEntity($payLoad) { if (is_object($payLoad)) { $payLoad = ($payLoad instanceof Proxy) ? get_parent_class($payLoad) : get_class($payLoad); } return !$this->em->getMetadataFactory()->isTransient($payLoad); } private function addEntityColumnValues(&$serializedPayload, $entity){ $serializedPayload->data->attributes = new /stdClass(); $classMetaData = $this->em->getClassMetadata(get_class($entity)); $columnNames = $classMetaData->getColumnNames(); foreach($columnNames as $columnName){ $fieldName = $classMetaData->getFieldForColumn($columnName); $getter = ''get''.ucfirst($fieldName); $serializedPayload->data->attributes->$columnName = $entity->$getter(); } }


Si solo necesita obtener las propiedades de la entidad de una manera rápida y fácil, esto es lo que hago en mis proyectos:

Todas mis entidades heredan de una clase EntityBase, que tiene el siguiente método:

public function toValueObject() { $result = new /stdClass(); foreach ($this as $property => $value) { $getter = ''get'' . ucfirst($property); if (method_exists($this, $getter)) { $result->$property = $this->$getter(); } } return $result; }

Entonces, todo lo que tengo que hacer es llamar a $entity->toValueObject() y $entity->toValueObject() un objeto estándar con todas las propiedades de la entidad como propiedades públicas.


Use findOneBy lugar de findOneBy para seleccionar una sola fila.

$myblogrepo = $this->_doctrine->getRepository(''Entities/Blog'')->findOneBy(array(''id'' => 12);

Tu clave fue 0 porque era la primera fila en un posible resultado de varias filas.