在DQL(Doctrine)中的另一个SELECT查询中实现SELECT查询

时间:2013-01-18 11:30:10

标签: mysql sql doctrine dql doctrine-1.2

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

有什么想法吗?

2 个答案:

答案 0 :(得分:1)

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

我不知道你使用的是什么版本的学说,所以我们来谈谈两种可能性。

CASE DOCTRINE1

一种可能性是按照j0k的建议使用Doctrine_RawSql,但只适用于 Doctrine1.x

CASE DOCTRINE2

您更有可能使用最新版本的Doctrine(版本> 2.0 )。您可以阅读here,但不应指向使用Doctrine_RawSql。而是使用official tutorial中显示的函数createNativeQuery

答案 1 :(得分:0)

是的,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();