我有一个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" )
有什么想法吗?
答案 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();