Comment ADHÉRER sans table relationnelle dans Symfony Doctrine avec le QueryBuilder entre 2 entités

J'ai une Entité Vidéo en rapport avec une Entité Catégorie et j'ai besoin d'exécuter cette SQL avec la Doctrine QueryBuilder, avec ce que je peux obtenir le plus utilisé dans toutes les catégories de vidéos (plus de 1000):

    SELECT c.*
    FROM Video v
    INNER JOIN video_category vc ON vc.video_id = v.id
    INNER JOIN Category c ON vc.category_id = c.id
    GROUP BY c.id
    HAVING COUNT(v.id) > 1000
    ORDER BY c.name ASC;

Mon querybuilder:

    $queryBuilder = $this->getEntityManager()
        ->createQueryBuilder()
        ->select('c')
        ->from('AcmeVideoBundle:Video', 'v')
        //Can Doctrine join itself silently with relational info in the Entities?
        ->join('AcmeCategoryBundle:Category', 'c', Expr\Join::WITH, 'v.id = c.id')
        ->groupBy('c.id')
        ->having('COUNT(v.id) > 1000')
        ->orderBy('c.name', 'ASC')
        ->getQuery();

Mais la requête SQL de sortie par queryBuilder est-ce:

    SELECT c0_.id AS id0, c0_.NAME AS name1 
    FROM Video v1_ 
    INNER JOIN Category c0_ ON (v1_.id = c0_.id) 
    GROUP BY c0_.id 
    HAVING COUNT(v1_.id) > 1000
    ORDER BY c0_.NAME ASC

Sans la table relationnelle (video_category)

Les Entités de la cartographie:

    /**
     * Video
     *
     * @ORM\Table
     * @ORM\Entity(repositoryClass="Acme\VideoBundle\Entity\VideoRepository")
     */
    class Video
    {
        /**
         * @ORM\Id
         * @ORM\Column(type="integer")
         * @ORM\GeneratedValue(strategy="AUTO")
         */
        private $id;

        /**
         * @ORM\ManyToMany(targetEntity="Acme\CategoryBundle\Entity\Category", cascade={"persist"})
         */
        private $category;

        //More fields, getters and setters etc...
    }

    /**
     * Category
     *
     * @ORM\Table
     * @ORM\Entity(repositoryClass="Acme\CategoryBundle\Entity\CategoryRepository")
     */
    class Category
    {
        /**
         * @ORM\Id
         * @ORM\Column(type="integer")
         * @ORM\GeneratedValue(strategy="AUTO")
         */
        private $id;

        /**
         * @ORM\Column(type="string", length=255)
         */
        private $name;

        //More fields, getters and setters etc...
    }

Comment puis-je utiliser la table de relation pour exécuter l'original de la requête SQL avec la doctrine Querybuilder? J'ai raté quelque chose?

INFO: Quand je findBy{champ}, persistent, une couleur claire sur toutes les entités fonctionne très bien, la Doctrine relations sont ok, j'ai une Vidéo, la Catégorie et le video_category tables fine, l'original de la requête SQL fonctionne parfaitement.

  • Avez-vous essayé de déclarer la table de relation comme vous l'avez fait avec votre JOIN?
  • Yep: [Semantical Erreur] la ligne 0, col 54 près de 'video_category': Error: Class 'video_category" n'est pas défini.
InformationsquelleAutor Tecnocat | 2014-02-02