9
votes

Puis-je itération sur les propriétés d'une entité dans la doctrine2?

J'utilise xxx

i accès via xxx

Comment puis-je obtenir les noms de champs? Je pensais que la clé => travaillerait mais elle imprime s la clé comme 0

donc je pensais que cela fonctionnerait: xxx

mais toujours rien .. }


0 commentaires

4 Réponses :


1
votes

Utilisez FINCHONEBY CODE> au lieu de FindBy CODE> Pour sélectionner une seule ligne.

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


6 commentaires

Essayé cela aussi, mais vous ne pouvez pas vous engager, vous pouvez simplement y accéder via: $ myblogpo-> id mais c'est la valeur, comment puis-je obtenir le nom de clés? ou nom de champ?


Faire $ iterableresult = $ myblogpo-> itérer (); et utiliser foreach ($ iterableResult as $ clé => $ valeur) à itérer les valeurs. doctrine-project.org/docs/orm/2.0/fr/reference/...


Et vous pouvez absolument itérer sur un objet avec foreach . Juste l'essayer.


juste fait ça. Avis: propriété non définie: entités \ blog :: $ itérer


Assurez-vous d'utiliser $ myblogpo-> itérer (); et pas $ myblogpo-> itérer; . itérer () est une méthode, pas une propriété.


J'ai toujours la même erreur. Dois-je ajouter cette méthode dans mes entités ou quelque chose de .. J'utilise itérer ()



21
votes

Dans toutes les vraisemblances, les propriétés de votre blog d'une entité sont déclarées comme protégé . C'est pourquoi vous ne pouvez pas iTER les sur eux de l'extérieur de l'entité elle-même.

Si vous utilisez vos entités de blogs en lecture seule et que vous avez besoin d'un accès aux propriétés marquées comme @Columns (en lecture: vous Vous n'avez pas besoin d'appeler des méthodes sur votre entité), vous pourriez envisager d'utiliser l'hydratation Array. De cette façon, vous traiterez de simples tableaux, et $ k => $ v type itération fonctionnera bien.

Sinon, vous devez créer une sorte de gettvalues () Méthode sur votre classe d'entité. Cela pourrait être une simple implémentation qui ne construit et le rend le rend le rend le revient.

Enfin, vous pouvez créer une fonction gettvalues ​​à usage général () en tant que fonction utilitaire utilisant des métadonnées de classe de doctrine pour comprendre les colonnes et l'entité a et fonctionne sur ces données. Une simple implémentation comme celle-ci: xxx

edit - une version plus mature de la méthode ci-dessus semble être - Je n'ai pas encore joué avec ça, mais il semble prometteur.


0 commentaires

2
votes

Si vous avez juste besoin d'obtenir les propriétés de l'entité de manière rapide et facile, c'est ce que je fais dans mes projets:

Toutes mes entités hériter d'une classe d'entitébase, qui a la méthode suivante: xxx

de sorte que tout ce que je dois faire est d'appeler $ entity-> tovalueObject () et j'obtiens un objet standard avec toutes les propriétés de l'entité en tant que propriétés publiques .


0 commentaires

0
votes

Ceci est une ma mise en œuvre d'une classe de sérialisation qui vérifie également s'il s'agit d'une entité de doctrine:

/**
 * 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();
    }
}


0 commentaires