Symfony2 - 计算行/连接表

时间:2014-06-05 15:11:43

标签: symfony doctrine-orm count

我是Symfony2的初学者......

我有一个表"TUTORIEL"和另一个表'Groupe_de_categories' 'id_groupe_categorie'

TutorielsTABLE 'TUTORIEL'

Groupe_de_categories TABLE 'Groupe_de_categories'

我需要计算每个"titre_categorie_nv1"(在我的示例中'Maison''Art&Loisir''Enseignement' ...)我有多少"TUTORIEL" "tutoriel_controle" = 'no'

tuto categories

在使用Synfony2之前,我在PHP中使用此代码(效果很好):

<?php

$query_nb_cat = "SELECT CATEGORIE, COUNT(*) 
    FROM Tutoriels 
    INNER JOIN Groupe_de_categories 
    ON TUTORIEL.id_groupe_categorie = Groupe_de_categories.id_groupe_categorie 
    WHERE tutoriel_controle='no' 
    GROUP BY CATEGORIE_TITLE";

$nb_cat = mysqli_query($BDD_connect, $query_nb_cat)or die(log_mysql($query_nb_cat));
    $row_nb_cat = mysqli_fetch_assoc($nb_cat);
do {
    $tableau_nb_cat[]=array(
        'titre_cat_nv1'=>$row_nb_cat['titre_categorie_nv1'],
        'compte_cat_nv1'=>$row_nb_cat['COUNT(*)'],
    );
} while ($row_nb_cat = mysqli_fetch_assoc($nb_cat));

$val_cat=array(
    'valeur_retour'=>$tableau_nb_cat
);
mysqli_free_result($nb_cat);

mysqli_close($BDD_connect);
?>

结果是这样的:

Maison =&gt; 3

Art&amp; Loisir =&gt; 9

Enseignement =&gt; 14

...

如何使用Symfony2执行此操作?

这是我的ORM:

Tutoriel 'Video2LearnBddBundle:Tutoriels'

Tutoriels
{
    /**
     * @var integer
     *
     * @ORM\Column(name="id_tutoriel", type="integer", nullable=false)
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="IDENTITY")
     */
    private $idTutoriel;

    /**
     * @var string
     *
     * @ORM\Column(name="titre", type="string", length=70, nullable=false)
     */
    private $titre;

    /**
     * @var string
     *
     * @ORM\Column(name="description", type="text", nullable=false)
     */
    private $description;

    /**
     * @var \DateTime
     *
     * @ORM\Column(name="date_creation", type="datetime", nullable=false)
     */
    private $dateCreation = 'CURRENT_TIMESTAMP';

    /**
     * @var string
     *
     * @ORM\Column(name="nombre_de_vues", type="string", length=45, nullable=true)
     */
    private $nombreDeVues;

    /**
     * @var string
     *
     * @ORM\Column(name="FAQs", type="string", length=45, nullable=true)
     */
    private $faqs;

    /**
     * @var string
     *
     * @ORM\Column(name="exclusivite", type="string", nullable=false)
     */
    private $exclusivite;

    /**
     * @var string
     *
     * @ORM\Column(name="eligible_promotion", type="string", nullable=false)
     */
    private $eligiblePromotion;

    /**
     * @var string
     *
     * @ORM\Column(name="info_moderateur", type="string", length=300, nullable=true)
     */
    private $infoModerateur;

    /**
     * @var string
     *
     * @ORM\Column(name="tutoriel_controle", type="string", nullable=false)
     */
    private $tutorielControle = 'non';

    /**
     * @var string
     *
     * @ORM\Column(name="niveau_choix_categorie_autre", type="string", nullable=true)
     */
    private $niveauChoixCategorieAutre;

    /**
     * @var string
     *
     * @ORM\Column(name="categorie_autre", type="string", length=45, nullable=true)
     */
    private $categorieAutre;

    /**
     * @var \GroupeDeCategories
     *
     * @ORM\ManyToOne(targetEntity="GroupeDeCategories")
     * @ORM\JoinColumns({
     *   @ORM\JoinColumn(name="id_groupe_categorie", referencedColumnName="id_groupe_categorie")
     * })
     */
    private $idGroupeCategorie;

    /**
     * @var \Membres
     *
     * @ORM\ManyToOne(targetEntity="Membres")
     * @ORM\JoinColumns({
     *   @ORM\JoinColumn(name="id_membre", referencedColumnName="id_membre")
     * })
     */
    private $idMembre;

    /**
     * @var \Doctrine\Common\Collections\Collection
     *
     * @ORM\ManyToMany(targetEntity="MotsCles", inversedBy="idTutoriel")
     * @ORM\JoinTable(name="mots_cles_et_tutoriels",
     *   joinColumns={
     *     @ORM\JoinColumn(name="id_tutoriel", referencedColumnName="id_tutoriel")
     *   },
     *   inverseJoinColumns={
     *     @ORM\JoinColumn(name="mots_cles", referencedColumnName="mots_cles")
     *   }
     * )
     */
    private $motsCles;

Groupe_de_categorie GroupeDeCategories

<?php

namespace Video2Learn\BddBundle\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * GroupeDeCategories
 *
 * @ORM\Table(name="Groupe_de_categories", indexes={
 *      @ORM\Index(name="fk_Groupe_de_categories_Categories_nv11_idx", columns={"titre_categorie_nv1"}), 
 *      @ORM\Index(name="fk_Groupe_de_categories_Categories_nv21_idx", columns={"titre_categorie_nv2"}), 
 *      @ORM\Index(name="fk_Groupe_de_categories_Categories_nv31_idx", columns={"titre_categorie_nv3"}), 
 *      @ORM\Index(name="fk_Groupe_de_categories_Categories_nv41_idx", columns={"titre_categorie_nv4"}), 
 *      @ORM\Index(name="fk_Groupe_de_categories_Categories_nv51_idx", columns={"titre_categorie_nv5"})
 * })
 * @ORM\Entity
 */
class GroupeDeCategories
{
    /**
     * @var integer
     *
     * @ORM\Column(name="id_groupe_categorie", type="integer", nullable=false)
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="IDENTITY")
     */
    private $idGroupeCategorie;

    /**
     * @var \CategoriesNv1
     *
     * @ORM\ManyToOne(targetEntity="Video2Learn\BddBundle\Entity\CategoriesNv1", inversedBy="GroupeDeCategories")
     * @ORM\JoinColumns({
     *   @ORM\JoinColumn(name="titre_categorie_nv1", referencedColumnName="titre_categorie_nv1")
     * })
     */
    private $titreCategorieNv1;

    /**
     * @var \CategoriesNv2
     *
     * @ORM\ManyToOne(targetEntity="CategoriesNv2")
     * @ORM\JoinColumns({
     *   @ORM\JoinColumn(name="titre_categorie_nv2", referencedColumnName="titre_categorie_nv2")
     * })
     */
    private $titreCategorieNv2;


    /**
     * @var \CategoriesNv3
     *
     * @ORM\ManyToOne(targetEntity="CategoriesNv3")
     * @ORM\JoinColumns({
     *   @ORM\JoinColumn(name="titre_categorie_nv3", referencedColumnName="titre_categorie_nv3")
     * })
     */
    private $titreCategorieNv3;

    /**
     * @var \CategoriesNv4
     *
     * @ORM\ManyToOne(targetEntity="CategoriesNv4")
     * @ORM\JoinColumns({
     *   @ORM\JoinColumn(name="titre_categorie_nv4", referencedColumnName="titre_categorie_nv4")
     * })
     */
    private $titreCategorieNv4;

    /**
     * @var \CategoriesNv5
     *
     * @ORM\ManyToOne(targetEntity="CategoriesNv5")
     * @ORM\JoinColumns({
     *   @ORM\JoinColumn(name="titre_categorie_nv5", referencedColumnName="titre_categorie_nv5")
     * })
     */
    private $titreCategorieNv5;

谢谢!

3 个答案:

答案 0 :(得分:1)

您可以使用存储库中的createQueryBuilder来执行此操作,也可以将当前查询用作NativeQuery
以下是一个示例(我假设您的实体名称为TutorielsGroupeDeCategories

$em = $this->getDoctrine()->getManager();
$query = $em->getRepository('YourBundle:Tutoriels')
   ->createQueryBuilder('T')
   ->join('T.idGroupeCategorie', 'GC')
   -->select('COUNT(GC.titreCategorieNv1) AS CT1')
   ->where("T.tutorielControle = 'no'")
   ->groupBy('GC.titreCategorieNv1')
   ->getQuery();
$result = $query->getScalarResult(); //This will return an array of the counts

在您的实体中,我找不到要在GroupBy中使用的CATEGORIE_TITLECATEGORIE来添加选择内容;所以我按titreCategorieNv1对它们进行了分组。您可以为您的选择添加更多字段 也许此链接可以为您提供更多Symfony CreateQueryBuilder

答案 1 :(得分:0)

我做到了:

public function updateAction($type_update) 
{
    $request = Request::createFromGlobals();
    $result = $request->isXmlHttpRequest();
    if ($result === true) {
        switch ($type_update) {
            case "compteur_menu":
                $em = $this->getDoctrine()->getManager();
                $result = $em->createQuery("
                SELECT TC.titreCategorieNv1, COUNT(TC.titreCategorieNv1) AS num  
                FROM Video2LearnBddBundle:Tutoriels T
                INNER JOIN T.idGroupeCategorie GC
                INNER JOIN GC.titreCategorieNv1 TC
                WHERE T.tutorielControle='non'
                GROUP BY TC.titreCategorieNv1"
                        )
                        ->getResult();
                $response = new Response();
                $response->setStatusCode(Response::HTTP_OK);
                $response->setContent(json_encode($result));
                $response->headers->set('Content-Type', 'application/json');
                return $response;
            default:
                break;
        }
    }
}

答案 2 :(得分:-1)

您可以创建存储库(此处有更多信息:http://symfony.com/fr/doc/current/book/doctrine.html) 你可以使用Doctrine查询语言。

但我认为你的结构是错误的,有一个类别会更好,这个类别有一个父类别,......

所以你将拥有一个rootcatégory,它的孩子名字叫“Bricolage”,“Sport”,...... 例如,“Bricolage”会有一个类别“Peinture”作为孩子,等等;)