IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Symfony PHP Discussion :

Conversion requête date en query builder [2.x]


Sujet :

Symfony PHP

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2015
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Octobre 2015
    Messages : 10
    Points : 7
    Points
    7
    Par défaut Conversion requête date en query builder
    Bonjour,

    Je voudrais reformuler cette requête en Query builder,

    SELECT COUNT(`id`) FROM `inventaire` WHERE `debut` > DATE_SUB(now(), INTERVAL 1 MONTH)

    J'ai le début mais je n'arrive pas a convertir la fonction DATE_SUB sous Symfony2.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    public function getNbdatee() {
     
           return $this->createQueryBuilder('i')
     
                           ->select('COUNT(i)')
     
    ->where('i.debut = :debut')
     
    ->setParameter('debut', xxx)
     
                           ->getQuery()
     
                           ->getSingleScalarResult();
    Merci d'avoir pris un peu de votre temps,

    Cordialement.

  2. #2
    Membre averti
    Avatar de phpiste
    Homme Profil pro
    Développeur Senior
    Inscrit en
    Septembre 2006
    Messages
    251
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Développeur Senior
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2006
    Messages : 251
    Points : 445
    Points
    445
    Billets dans le blog
    7
    Par défaut
    Bonjour,

    T'a besoin d'une dql personalisé
    custum dql function
    je te sortirai une de l'un de mes projets dont j'utilise timediff (essai de l'adapter à ton besoin):

    créer une classe quelque part dans ton projet

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
     
    <?php
    namespace YourNameSpace\CoreBundle\Doctrine\DQL;
     
    use Doctrine\ORM\Query\AST\Functions\FunctionNode;
    use Doctrine\ORM\Query\Lexer;
     
    class MysqlTimeDiff extends FunctionNode
    {
        public $needle = null;
        public $haystack = null;
     
        public function parse(\Doctrine\ORM\Query\Parser $parser)
        {
            $parser->match(Lexer::T_IDENTIFIER);
            $parser->match(Lexer::T_OPEN_PARENTHESIS);
            $this->needle = $parser->ArithmeticPrimary();
            $parser->match(Lexer::T_COMMA);
            $this->haystack = $parser->ArithmeticPrimary();
            $parser->match(Lexer::T_CLOSE_PARENTHESIS);
        }
     
        public function getSql(\Doctrine\ORM\Query\SqlWalker $sqlWalker)
        {
            return "TIMEDIFF(".
                $this->needle->dispatch($sqlWalker).','.
                $this->haystack->dispatch($sqlWalker).
            ")";
        }
    }
    ensuite ajoute la conf relatif dans la section doctrine:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    # Doctrine Configuration
    doctrine:
        dbal: 
           ....
        orm:
            ....
            entity_managers:
                default:
                    ....
                    dql:
                        string_functions:
                            time_diff: Yournamespace\CoreBundle\Doctrine\DQL\MysqlTimeDiff
    et peux être faut vider le cache

    Ahmed
    Je suis Développeur Senior ouvert aux opportunités
    Mon blog

  3. #3
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Juin 2011
    Messages
    725
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juin 2011
    Messages : 725
    Points : 1 050
    Points
    1 050
    Par défaut
    Bonjour,

    Pourquoi ne pas gérer la date coté php?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    public function getNbdatee() {
            $date = new \DateTime('- 1 month');
            return $this->createQueryBuilder('i')
                            ->select('COUNT(i)')
                            ->where('i.debut > :date')
                           ->setParameter('date', $date->format('Y-m-d'))
                           ->getQuery()
                           ->getSingleScalarResult();

  4. #4
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2015
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Octobre 2015
    Messages : 10
    Points : 7
    Points
    7
    Par défaut
    Bonjour,

    Merci pour les solutions, j'avais oublié de passer le sujet en résolu je vous partage ma solution

    Mon repository
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    public function getNbdatee() {
     
           return $this->createQueryBuilder('i')
     
                           ->select('COUNT(i)')
     
    ->where('i.debut > :debut')
     
    ->setParameter('debut', new \DateTIME('-1 month'))
     
                           ->getQuery()
     
                           ->getSingleScalarResult();
       }
    Mon contrôleur

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
     
    public function statistique12Action($Nbdatee)
    {
    $inventaireEm = $this->getDoctrine()->getManager('inventaire');
           $inventaireRepo = $inventaireEm->getRepository('testInventaireBundle:Inventaire', 'inventaire');
           $Nbdatee = $inventaireRepo->getNbdatee(new \DateTime('now')); 
     
    //$url = $this->get('router')->generate(
       //'test_inventaire_statistique',
               //array('nb' => $nb)
    //);	
     
    return $this->render('testInventaireBundle:Default:statistique12.html.twig', array ('Nbdatee' => $Nbdatee));
     
     
     
    }
    Cordialement.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Requête complexe - colonnes et conversion de dates
    Par thierry922010 dans le forum SQLite
    Réponses: 0
    Dernier message: 23/10/2011, 21h29
  2. Aide pour requête SQL conversion de date
    Par lebanner82 dans le forum MS SQL Server
    Réponses: 9
    Dernier message: 08/07/2011, 16h35
  3. Réponses: 11
    Dernier message: 20/05/2008, 20h08
  4. Conversion de date dans une requête
    Par snoopy69 dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 11/08/2006, 08h28
  5. Conversion de date et division 64 bits
    Par dway dans le forum Assembleur
    Réponses: 38
    Dernier message: 27/01/2004, 10h31

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo