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 のバージョンがわからないので、2 つの可能性について話しましょう。

ケース教義1

1 つの可能性は、 j0kDoctrine_RawSqlで提案されているように を使用することですが、 Doctrine1.xに対してのみ問題ありません。

ケース教義2

Doctrine の最新バージョン (バージョン > 2.0 )を使用している可能性が高くなります。ここで読むかもしれないように、 use を指すべきではありません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 に答える