我是Symfony2的初学者......
我有一个表"TUTORIEL"
和另一个表'Groupe_de_categories'
'id_groupe_categorie'
表Tutoriels
:
表Groupe_de_categories
我需要计算每个"titre_categorie_nv1"
(在我的示例中'Maison'
,'Art&Loisir'
,'Enseignement'
...)我有多少"TUTORIEL"
"tutoriel_controle"
= 'no'
在使用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;
谢谢!
答案 0 :(得分:1)
您可以使用存储库中的createQueryBuilder
来执行此操作,也可以将当前查询用作NativeQuery
以下是一个示例(我假设您的实体名称为Tutoriels
和GroupeDeCategories
)
$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_TITLE
和CATEGORIE
来添加选择内容;所以我按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”作为孩子,等等;)