2013-01-18 43 views
0

我对MySQL有一个SQL查询,它给了我正确的结果。不过,我在使用DQL将其转换为Doctrine查询时遇到了一个问题。在DQL(Doctrine)中实现另一个SELECT查询中的SELECT查询

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") 

任何想法?

+0

你可能会在这[答问(HTTP看看://stackoverflow.com/questions/1869233/doctrine-subquery-in-from)。 – j0k

回答

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(); 
+0

谢谢@Jaskaran Singh –

1

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

我不知道你正在使用哪个版本的Doctrine,所以我们来谈谈两种可能性。

CASE DOCTRINE1

一种可能性是使用Doctrine_RawSql,通过j0k的建议,但它仅适用于是确定Doctrine1.x

CASE DOCTRINE2

它更可能是你使用的是最新学说版本(版本> 2.0)。由于您可能会读到here,因此您不应该指向使用Doctrine_RawSql。请使用功能createNativeQuery,如official tutorial所示。

+0

谢谢@Jean Valjean –