Recuperer les commentairess entre deux date

Doctrine

Le problème exposé dans ce sujet a été résolu.

Bonjour, dans mon repository j'ai une fonction pour récupérer des articles et j'aimerais récupérer les commentaires liées sur une période définis par ma requête uniquement. Donc me retrouver avec une collection de commes définis entre ses deux date.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
    return $this->createQueryBuilder('a')
                    ->select('a')
                    ->leftjoin('a.replies','r')
                    ->addSelect('r')
                    ->where('a.publish BETWEEN :date AND :now OR a.modification BETWEEN :date AND :now ')
                    ->andWhere('a.workspace IN (:follow)')
                    ->andWhere('r.date BETWEEN :date AND :now')
                    ->setParameter('follow', $follow)
                    ->setParameter('date', $dateD)
                    ->setParameter('now', new \DateTime('now'))
                    ->orderBy('a.modification', 'desc')
                    ->getQuery()
                    ->getResult();

la reques sql est juste je pense, mais doctrine me retourn 1 enregistrement.

1
2
3
4
5
6
SELECT *  
FROM newscast n0_ LEFT JOIN reply r1_ ON n0_.id = r1_.newscast_id 
WHERE (n0_.publish BETWEEN '01/03/2016' AND now() OR n0_.modification BETWEEN '01/03/2016' AND now())
AND n0_.workspace_id IN (1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,22,23,24,25,26,27,28,73) 
AND (r1_.date BETWEEN '01/03/2016' AND now()) 
ORDER BY n0_.modification DESC, r1_.date ASC

merci de votre aide.

+0 -0

petit up : car j'ai avancé !

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
    return $this->createQueryBuilder('a')
                    ->select('a')
                    ->leftJoin('a.replies','r','WITH', 'r.date BETWEEN :date AND CURRENT_DATE()')->set(1, $dateD)
                    ->addSelect('r')
                    ->where('a.publish BETWEEN :date AND :now OR a.modification BETWEEN :date AND :now ')
                    ->andWhere('a.workspace IN (:follow)')
                    //->andWhere('r.date BETWEEN :date AND :now')
                    ->setParameter('follow', $follow)
                    ->setParameter('date', $dateD)
                    ->setParameter('now', new \DateTime('now'))
                    ->orderBy('a.modification', 'desc')
                    ->getQuery()
                    ->getResult();

La fonction fait a peut prés le job. le hic sur les commentaires je n'ai que le premier.

+0 -0

L'utilisation de OR dans une requête sans le moindre parenthésage est souvent lieu à de nombreuse erreurs.

J'ai donc tendance à penser que tu devrais utiliser le query-builder pour faire ton OR afin que tout soit correct.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
<?php
$queryBuilder = $this->createQueryBuilder('a');
$queryBuilder->select('a')
                    ->leftJoin('a.replies','r','WITH', 'r.date BETWEEN :date AND CURRENT_DATE()')->set(1, $dateD)
                    ->addSelect('r')
                    ->where($queryBuilder->expr()->orX(
                          $queryBuilder->expr()->between('a.publish', $dateD,new \DateTime('now')),
                          $queryBuilder->expr()->between('a.modification', $dateD,new \DateTime('now')
                      )->andWhere('a.workspace IN (:follow)')
                       ->setParameter('follow', $follow)
                       ->orderBy('a.modification', 'desc')
                    ->getQuery()
                    ->getResult();

Utilisation de la fonction expr()

Ajoutons que l'utilisation de 'WITH', 'r.date BETWEEN :date AND CURRENT_DATE()' peut être aussi chiante pour la lisibilité par rapport au nombre de andWhere que tu as après.

+1 -0

ça ne marche pas j'ai aucun résultats ! ce n'est pas ce que j'attends. Certes c'est moins lisible, mais sans expr tu sais que ça marche.

+0 -0

Bon, j'ai trouvé les solution :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
<?php
 return $this->createQueryBuilder('a')
                    ->select('a')
                    ->leftJoin('a.replies','r','WITH', 'r.date BETWEEN :date AND :now')
                    ->addSelect('r')
                    ->where('a.publish BETWEEN :date AND :now OR a.modification BETWEEN :date AND :now ')
                    ->andWhere('a.workspace IN (:follow)')
                    //->andWhere('r.date BETWEEN :date AND :now')
                    ->setParameter('follow', $follow)
                    ->setParameter('date', $dateD)
                    ->setParameter('now', new \DateTime('now'))
                    ->orderBy('a.modification', 'desc')
                    ->getQuery()
                    ->getResult();

Tous simplement que current_date donne lieu à de nombreuse erreurs. J'ai utilisé :now ! Tous va bien. Merci

+1 -0
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte