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.