1

我有一个 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" ) 

任何的想法?

4

2 回答 2

1

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

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

案例原则1

正如j0kDoctrine_RawSql所建议的那样,一种可能性是使用,但仅适用于Doctrine1.x

案例原则2

您更有可能使用的是最新版本的 Doctrine ( versions > 2.0 )。正如您在此处所读到的,您不应该指向使用Doctrine_RawSql. 而是使用官方教程createNativeQuery中所示的功能。

于 2013-01-18T13:28:28.547 回答
0

是的,冉阿让是对的。

我的朋友,如果您的原始 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(); 
于 2013-01-19T20:44:23.260 回答