Récupérer la liste des champs et des associations d'une entité Doctrine

Publié le 01/08/2020 • Mis à jour le 01/08/2020


English language detected! 🇬🇧

  We noticed that your browser is using English. Do you want to read this post in this language?

Read the english version 🇬🇧 Close

Dans ce bout de code nous allons voir comment récupérer la liste des champs et des associations d'une entité Doctrine. D'abord, on récupère la méta-classe de l'entité que nous voulons analyser en passant sa FQCN à la méthode getClassMetadata() du manageur Doctrine. Puis, on peut récupérer les informations voulues grâce à deux méthodes dédiées.


<?php declare(strict_types=1);

// src/Controller/Snippet/Snippet107Trait.php

namespace App\Controller\Snippet;

use App\Entity\Article;
use Doctrine\Bundle\DoctrineBundle\Registry;

/**
 * J'utilise un trait PHP afin d'isoler chaque snippet dans un fichier.
 * Ce code doit être apellé d'un contrôleur Symfony étendant AbstractController (depuis Symfony 4.2)
 * ou Symfony\Bundle\FrameworkBundle\Controller\Controller (Symfony <= 4.1).
 * Les services sont injectés dans le constructeur du contrôleur principal.
 */
trait Snippet107Trait
{
    public function snippet107(): void
    {
        $doctrine = $this->getDoctrine();
        if (!$doctrine instanceof Registry) {
            throw new \RuntimeException("Houston, We Have a Problem. 💥");
        }

        $articleMetaData = $doctrine->getManager()->getClassMetadata(Article::class);
        var_dump($articleMetaData->getFieldNames());
        var_dump($articleMetaData->getAssociationNames());

        // That's it! 😁
    }
}

 Exécuter le snippet  ≪ this.showUnitTest ? this.trans.hide_unit_test : this.trans.show_unit_test ≫  Plus sur Stackoverflow   Lire la doc  Snippet aléatoire

<?php declare(strict_types=1);

namespace App\Tests\Controller\Snippets;

use App\Entity\Article;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Bundle\FrameworkBundle\Test\KernelTestCase;

/**
 * @covers Snippet107Trait
 */
final class Snippet107Test extends KernelTestCase
{
    private EntityManagerInterface $em;

    protected function setUp(): void
    {
        self::bootKernel();
        $this->em = self::$container->get(EntityManagerInterface::class);
    }

    /**
     * @covers Snippet107Trait::snippet107
     */
    public function testSnippet107(): void
    {
        $articleMetaData = $this->em->getClassMetadata(Article::class);
        $properties = $articleMetaData->getFieldNames();
        $associations = $articleMetaData->getAssociationNames();
        self::assertIsArray($properties);
        self::assertIsArray($associations);
        self::assertCount(19, $properties);
        self::assertCount(5, $associations);
    }
}