2015-10-30 34 views
2

每个Disque(d)都有Note(n)的关联集合。 我的查询生成器是根据关联的注释数来获取每个Disque。不适用于querybuilder中的计数的学说分页器

这里是上了班

class Disque 
{ 
    ... 

    /** 
    * @ORM\ManyToMany(targetEntity="Note", cascade={"persist"}) 
    */ 
    private $notes; 

    ... 

} 

class Note 
{ 
    ... 

    /** 
    * @ORM\ManyToOne(targetEntity="NoteValeur", cascade={"persist"}) 
    * @ORM\JoinColumn(nullable=true) 
    */ 
    private $noteValeur; 

    ... 
} 

class NoteValeur 
{ 
    ... 
    /** 
    * @Gedmo\Slug(fields={"titre"}) 
    * @ORM\Column(name="slug", unique=true, length=32) 
    */ 
    private $slug; 
} 

我使用学说的QueryBuilder获取结果的峰值,使用数设定阈值。

<?php 

... 

class DisqueRepository extends \Doctrine\ORM\EntityRepository 
{ 
    public function getDisquesByNotesAndAllInfo($slug, $seuil, $page, $nbPerPage) 
    { 
     $q = $this->createQueryBuilder('d'); 
     $q 
       ->select('d as infosDisque') 
       ->leftJoin('d.pochettes', 'p') 
       ->addSelect('p') 
       ->leftJoin('d.groupes','g') 
       ->addSelect('g') 
       ->leftJoin('d.labelDisque', 'l') 
       ->addSelect('l') 
       ->leftJoin('d.chroniques','c') 
       ->addSelect('c') 
       ->leftJoin('d.notes', 'n') 
       ->addSelect('n') 
       ->innerJoin('n.noteValeur','nv') 
       ->addSelect('nv') 
       ->groupBy('d') 
       ->addSelect('COUNT(d) as NbNotes') 
       ->where('nv.slug LIKE :slug') 
       ->setParameter('slug', $slug) 
       ->having($q->expr()->gte('NbNotes',':seuil')) 
       ->setParameter('seuil', $seuil) 
       ->setFirstResult(($page-1) * $nbPerPage) 
       ->setMaxResults($nbPerPage) 
       ->orderBy('d.dateSortieDisque', 'desc') 
     ; 

     return new Paginator($q, true); 

    } 
} 

结果集非常好。问题是,当我更改$ page值时,SQL中的偏移量不会增加。无论如何,我都会得到相同的结果范围。

symfony的探查给我下面的可执行查询

SELECT DISTINCT id_44 
FROM (
    SELECT 
     COUNT(s0_.id) AS sclr_0, s0_.id AS id_1, s0_.titre AS titre_2, s0_.datesortiedisque AS datesortiedisque_3, s0_.nombreDisque AS nombreDisque_4, s0_.remarque AS remarque_5, s0_.tracklist AS tracklist_6, s0_.lineup AS lineup_7, s0_.slug AS slug_8, s0_.coderef AS coderef_9, 
     s1_.id AS id_10, s1_.alt AS alt_11, s1_.url AS url_12, s1_.coderef AS coderef_13, s1_.ordre AS ordre_14, s1_.fichier AS fichier_15, 
     s2_.id AS id_16, s2_.nom AS nom_17, s2_.site AS site_18, s2_.motto AS motto_19, s2_.popularite AS popularite_20, s2_.slug AS slug_21, s2_.coderef AS coderef_22, 
     s3_.id AS id_23, s3_.titre AS titre_24, s3_.slug AS slug_25, s3_.coderef AS coderef_26, 
     s4_.id AS id_27, s4_.texte AS texte_28, s4_.resume AS resume_29, s4_.dateSaisie AS dateSaisie_30, s4_.lectures AS lectures_31, s4_.slug AS slug_32, s4_.coderef AS coderef_33, 
     s5_.id AS id_34, s5_.dateSaisie AS dateSaisie_35, s5_.coderef AS coderef_36, s6_.id AS id_37, 
     s6_.titre AS titre_38, s6_.valeur AS valeur_39, s6_.image AS image_40, s6_.coderef AS coderef_41, s6_.octal AS octal_42, s6_.slug AS slug_43, 
     s0_.id AS id_44, s0_.titre AS titre_45, s0_.datesortiedisque AS datesortiedisque_46, s0_.nombreDisque AS nombreDisque_47, s0_.remarque AS remarque_48, s0_.tracklist AS tracklist_49, s0_.lineup AS lineup_50, s0_.slug AS slug_51, s0_.coderef AS coderef_52 
    FROM 
     se_disque s0_ 
     LEFT JOIN disque_pochette d7_ ON s0_.id = d7_.disque_id 
     LEFT JOIN se_pochette s1_ ON s1_.id = d7_.pochette_id 
     LEFT JOIN disque_groupe d8_ ON s0_.id = d8_.disque_id 
     LEFT JOIN se_groupe s2_ ON s2_.id = d8_.groupe_id 
     LEFT JOIN se_labeldisque s3_ ON s0_.label_disque_id = s3_.id 
     LEFT JOIN disque_chronique d9_ ON s0_.id = d9_.disque_id 
     LEFT JOIN se_chronique s4_ ON s4_.id = d9_.chronique_id 
     LEFT JOIN disque_note d10_ ON s0_.id = d10_.disque_id 
     LEFT JOIN se_note s5_ ON s5_.id = d10_.note_id 
     INNER JOIN se_notevaleur s6_ ON s5_.note_valeur_id = s6_.id 
    WHERE 
     s6_.slug LIKE 'classique' 
    GROUP BY 
     s0_.id, s0_.titre, s0_.datesortiedisque, s0_.nombreDisque, s0_.remarque, s0_.tracklist, s0_.lineup, s0_.slug, s0_.coderef, s0_.label_disque_id, s0_.format_id, s0_.format_discographique_id 
    HAVING 
     sclr_0 >= 2 
) dctrn_result 
ORDER BY datesortiedisque_3 DESC LIMIT 10 OFFSET 10 

我似乎无法改变这个查询偏移不管我传递给$ Q-> setFirstResult()共用方法。

有没有人有线索?

+0

正如我相信你知道的,连接可能会导致偏移。您的查询对我来说太复杂了,无法浏览它。我开始做两个查询。第一个只是返回一个ID列表。使用偏移量可以很容易地限制ID的数量。第二个查询然后使用简单的WHERE ID IN(:ids)条件检索所需的信息。在大多数情况下,一旦我得到所需的结果,我可以使用嵌套的select语句来组合查询。在某些情况下,我只是把他们分开。 – Cerad

+1

你在用什么Paginator?我猜你可能需要从QueryBuilder对象中获取getQuery(),然后将其提供给Paginator。也可以在查询对象上设置FirstResult和MaxResults。 – Pradeep

+0

我正在使用Doctrine的paginator(使用Doctrine \ ORM \ Tools \ Pagination \ Paginator;)。在查询而不是queryBuilder上关联setFirstResult和setMaxResults似乎没有改变任何东西。分解查询也没有。 – Turquoise

回答

0

嘛,你猜怎么着,我是用我的控制器调试价值,我已经忘记了它:

$disques = $dr->getDisquesByNotesAndAllInfo($slug, $seuil, 2, $nbPerPage); 

所有现在工作得很好,我改回这混乱的“2”的值。 对不起。感谢你们两位的帮助!