Question

I have a SQL query for MySQL which is giving me the correct result. However, I'm facing a problem in converting it to a Doctrine query with DQL.

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 

I am trying the following:

 $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();

That returns:

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

Any idea?

Was it helpful?

Solution 2

Yes, Jean Valjean is right.

My friend, if your raw SQL is working well then why don't you use raw SQL Query.

Let me help you in writing this.

First you need PDO (PHP data object), which is will be database handler for your raw query.

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

then prepare the statement and execute it:

$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();

You can also pass parameters like follows:

$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(); 

OTHER TIPS

I noticed that your raw SQL query works fine, so why don't use use a raw sql query with Doctrine.

I don't know which version of Doctrine you are using, so let's talk about two possibilities.

CASE DOCTRINE1

One possibility is to use Doctrine_RawSql, as suggested by j0k, but it is ok only for Doctrine1.x.

CASE DOCTRINE2

It is more likely that you are using a recent version of Doctrine (versions > 2.0). As you may read here, you should not point to use Doctrine_RawSql. Instead use function createNativeQuery as shown in the official tutorial.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top