Précédent   Forum des professionnels en informatique > PHP > Bibliothèques et frameworks > symfony
symfony Forum d'entraide sur le framework PHP symfony. Avant de poster : cours symfony et FAQ symfony
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 12/10/2011, 15h29   #1
Membre éclairé
 
Inscription : avril 2004
Messages : 328
Détails du profil
Informations forums :
Inscription : avril 2004
Messages : 328
Points : 336
Points : 336
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 :
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
bilbonec est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/10/2011, 10h08   #2
Modérateur
 
Avatar de Michel Rotta
 
Homme Michel Rotta
Responsable d'exploitation informatique
Inscription : septembre 2005
Messages : 4 913
Détails du profil
Informations personnelles :
Nom : Homme Michel Rotta
Âge : 49
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Responsable d'exploitation informatique
Secteur : Distribution

Informations forums :
Inscription : septembre 2005
Messages : 4 913
Points : 7 505
Points : 7 505
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.
__________________
Si tu donnes un poisson à un homme, il mangera un jour. Si tu lui apprends à pêcher, il mangera toujours (Lao Tseu).
  • Pensez à valoriser les réponses pertinantes, cliquez sur le bouton vert +1 pour indiquer votre accord avec la solution proposée.
  • Pensez à utiliser la balise [code] pour afficher du code, elle est cachée sous le bouton [#] dans l'éditeur.
  • Une discussion est terminée ? Alors le bouton est votre ami !
Michel Rotta est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/10/2011, 14h05   #3
Membre éclairé
 
Inscription : avril 2004
Messages : 328
Détails du profil
Informations forums :
Inscription : avril 2004
Messages : 328
Points : 336
Points : 336
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.
bilbonec est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 04h44.


 
 
 
 
Partenaires

Hébergement Web