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.
Vous devez vous connecter pour publier un commentaire.
Oui! En fait, c'est l'une des principales raisons pour l'utilisation d'un ORM comme Doctrine 2.
Essayer:
Le manuel va plus dans les détails, mais curieusement ne semble pas avoir de rejoindre exemple. D'où la confusion commune.
http://docs.doctrine-project.org/en/latest/reference/query-builder.html
Et vous ne pouvez pas être conscient de cela, mais l'organisation des Nations Unies a adopté une résolution interdisant l'utilisation des abréviations pour les alias. Juste pour être sûr, essayons:
Ok, résolu, le problème était que les Entités n'est pas tout tracé pour ManyToMany relation bidirectionnelle.
Les Entités sont maintenant:
Et la finale QueryBuilder de travail (maintenant avec alias version :P):
En ce qui concerne meilleur