2013-01-18 5 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

하나의 가능성은 j0k에 의해 제안, Doctrine_RawSql을 사용하는 것입니다,하지만 그것은 단지 에 대한 Doctrine1.x 괜찮습니다.

CASE DOCTRINE2

교리의 최신 버전 (버전> 2.0)를 사용하는 가능성이 높습니다. here을 읽을 수 있으므로 Doctrine_RawSql을 사용해서는 안됩니다. 대신 official tutorial에 표시된대로 createNativeQuery 기능을 사용하십시오.

+0

감사합니다. @ 장 Valjean –