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