Recuperer les commentairess entre deux date

Doctrine

L'auteur de ce sujet a trouvé une solution à son problème.
Auteur du sujet

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.

Édité par darkiron

Développeur php depuis 10 ans. Si vous penser que mon message est agressif, je vous rassure ce n'est pas le cas ou alors je …

+0 -0
Auteur du sujet

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.

Développeur php depuis 10 ans. Si vous penser que mon message est agressif, je vous rassure ce n'est pas le cas ou alors je …

+0 -0
Staff

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.

Édité par artragis

+2 -0
Auteur du sujet

ç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.

Développeur php depuis 10 ans. Si vous penser que mon message est agressif, je vous rassure ce n'est pas le cas ou alors je …

+0 -1
Auteur du sujet

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

Édité par darkiron

Développeur php depuis 10 ans. Si vous penser que mon message est agressif, je vous rassure ce n'est pas le cas ou alors je …

+1 -0
Vous devez être connecté pour pouvoir poster un message.
Connexion

Pas encore inscrit ?

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