【问题标题】:Implementing SELECT query inside another SELECT query in DQL (Doctrine)在 DQL 中的另一个 SELECT 查询中实现 SELECT 查询(Doctrine)
【发布时间】:2013-01-18 11:30:10
【问题描述】:

我有一个 MySQL 的 SQL 查询,它给了我正确的结果。但是,我在使用 DQL 将其转换为 Doctrine 查询时遇到了问题。

SELECT Sum(s) AS s 
FROM   (SELECT DISTINCT oder.id   AS m, 
                        o_t.restaurants_id, 
                        o_t.value AS s 
        FROM   orders AS oder 
               INNER JOIN order_total AS o_t 
                       ON oder.id = o_t.orders_id 
               INNER JOIN order_status AS o_s 
                       ON oder.id = o_s.orders_id 
        WHERE  o_s.status = 1 
               AND o_t.code = 'total') a 

我正在尝试以下方法:

 $query = Doctrine_Query::create()
        ->select('sum(s) as s')
        ->addSelect('DISTINCT order.id,o_t.value')
        ->from('orders as order')
        ->leftJoin('order.order_total as o_t')
        ->leftJoin('order.order_status as o_s_i')
        ->where('o_s_i.status = '.order_status::ORDER_COMPLETE)
        ->andWhere('o_t.code = "total"')->getSqlQuery();

返回:

SELECT DISTINCT o.id     AS o__id, 
                o2.id    AS o2__id, 
                o2.value AS o2__value, 
                Sum(s)   AS o__0 
FROM   orders o 
       LEFT JOIN order_total o2 
              ON o.id = o2.orders_id 
       LEFT JOIN order_status o3 
              ON o.id = o3.orders_id 
WHERE  ( o3.status = 1 
         AND o2.code = "total" ) 

有什么想法吗?

【问题讨论】:

标签: mysql sql doctrine dql doctrine-1.2


【解决方案1】:

我注意到您的原始 SQL 查询工作正常,那么为什么不使用 Doctrine 的原始 sql 查询。

不知道你用的是哪个版本的Doctrine,所以说一下两种可能吧。

案例原则1

一种可能性是使用Doctrine_RawSql,正如j0k 所建议的那样,但它只适用于Doctrine1.x

案例原则2

您更有可能使用的是最新版本的 Doctrine(versions > 2.0)。正如你可能读到的here,你不应该指向使用Doctrine_RawSql。而是使用函数createNativeQuery,如official tutorial 所示。

【讨论】:

    【解决方案2】:

    是的,Jean Valjean 是对的。

    我的朋友,如果您的原始 SQL 运行良好,那么您为什么不使用原始 SQL 查询。

    让我帮你写这篇文章。

    首先您需要 PDO(PHP 数据对象),它将作为原始查询的数据库处理程序。

    $pdo = Doctrine_Manager::getInstance()->getCurrentConnection()->getDbh();
    

    然后准备语句并执行它:

    $query = "SELECT Sum(s) AS s 
    FROM   (SELECT DISTINCT oder.id   AS m, 
                            o_t.restaurants_id, 
                            o_t.value AS s 
            FROM   orders AS oder 
                   INNER JOIN order_total AS o_t 
                           ON oder.id = o_t.orders_id 
                   INNER JOIN order_status AS o_s 
                           ON oder.id = o_s.orders_id 
            WHERE  o_s.status = 1 
                   AND o_t.code = 'total') a";
    
    $stmt = $pdo->prepare($query);
    $stmt->execute();
    $results = $stmt->fetchAll();
    

    你也可以像下面这样传递参数:

    $query = "SELECT * FROM table WHERE param1 = :param1 AND param2 = :param2";
    $stmt = $pdo->prepare($query);
    
    $params = array(
      "param1"  => "value1",
      "param2"  => "value2"
    );
    $stmt->execute($params);
    
    $results = $stmt->fetchAll(); 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-04-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-02
      • 1970-01-01
      • 2021-08-05
      • 2022-01-22
      相关资源
      最近更新 更多