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 :

Requête "évoluée" en SQL traductible en DQL ?


Sujet :

Symfony PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre chevronné
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    396
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 396
    Par défaut Requête "évoluée" en SQL traductible en DQL ?
    Bonjour,

    J'ai besoin d'écrire une requête "évoluée" en Doctrine mais je n'ai pas trouvé comment l'écrire en DQL et ai donc une bien moche requête SQL à la place (ce qui est grandement déconseillé, vu que le but de l'ORM est justement d'éviter d'être DB-spécifique).

    Le but de cette requête est de supprimer tous les DiscountMatrix DM qui possèdent un range de date inclus dans celui d'un MasterPriceList.

    Une contrainte de plus étant que, les DM possèdent une relation 1-n avec des DiscountMatrixProducts et les MPL possèdent une relation 1-n avec des MasterPriceListProducts. Et lors de la suppression, les DM que l'on supprime doivent avoir des DMP tels que:
    - DMP.product_id = MPL.product_id ;
    - DMP.market_id = MPL.market_id

    Ce qui donne en SQL :
    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
    31
    32
    33
    34
    35
    36
     
     
        /**
         * Deletes the SalesPrices that are included in the range
         * 
         * @param Date $lowerStart A starting_date
         * @param Date $higherEnd  An ending_date
         * 
         * @return nothing
         * @todo Find a DQL way to do SQL job
         */
        protected function deletePricesIn($lowerStart, $higherEnd)
        {
            $PDO = Doctrine_Manager::getInstance()->connection()->getDbh();
            $PDO->prepare(
                " DELETE FROM toy_master_price_list WHERE id IN ("
                . " SELECT id FROM ("
                . "  SELECT mpl.id FROM toy_master_price_list AS mpl INNER JOIN toy_price_list_product AS tpp"
                . "  WHERE"
                . "   EXISTS ("
                . "    SELECT 1 FROM toy_discount_matrix AS dm INNER JOIN toy_discount_matrix_product AS dmp"
                . "     WHERE dm.id = '" . $this->source->getId() . "'"
                . "           AND dm.type = '" . $this->getDiscountMatrixType() . "'"
                . "           AND dmp.discount_matrix_id = dm.id"
                . "           AND dmp.product_id = tpp.product_id"
                . "           AND dmp.market_id = tpp.market_id"
                . "           AND dm.title = mpl.title"
                . "   )"
                . "   AND tpp.master_price_list_id = mpl.id"
                . "   AND mpl.type <= '" . $this->getMasterPriceListType() . "'"
                . "   AND mpl.starting_date >= '$lowerStart'"
                . "   AND mpl.ending_date <= '$higherEnd'"
                . "  )"
                . " t)"
            )->execute();
        }
    nb : l'imbrication de SELECT vient du fait qu'en SQL on ne peut pas avoir de INNER JOIN associé directement à la même table qu'un DELETE.

    Merci de toute aide, ça me fend le cœur d'avoir à laisser cette requête en SQL très crade

  2. #2
    Expert confirmé
    Avatar de Michel Rotta
    Homme Profil pro
    DPO
    Inscrit en
    Septembre 2005
    Messages
    4 954
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : DPO
    Secteur : Distribution

    Informations forums :
    Inscription : Septembre 2005
    Messages : 4 954
    Par défaut
    Le DQL présente l'avantage d'être détaché du SQL utilisé par le moteur.

    Mais l’inconvénient c'est que pour obtenir cette indépendance ne peut prendre en compte tous les cas.

    A partir de là, ta requête sort apparemment de ce qui est réalisable en DQL.

    Tu as choisi la bonne méthode.

  3. #3
    Membre chevronné
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    396
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 396
    Par défaut
    Merci de ta réponse Michel.

    J'espérais avoir une solution miracle à appliquer. Surtout dans la mesure où j'ai 8 requêtes de ce type !! Je déteste avoir à garder ce genre d'horreurs dans le code

    Je laisse à "Non résolu" au cas où quelqu'un ait une meilleure piste.

Discussions similaires

  1. [MySQL] Insérer résultat d'une requête : problème de quote
    Par maxime17s dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 05/12/2008, 03h42

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