如何使用Zend框架
进行这样的查询SELECT * FROM `productos` AS `p`
LEFT JOIN (SELECT SUM(cantidad) AS transferencias FROM transferencias WHERE upc = p`.`upc` and sucursal = 10)
AS `trans` ON trans.upc = p.upc AND trans.sucursal_clave_destino = 10
提前谢谢。
答案 0 :(得分:2)
你需要尝试这个。 我无法尝试,但您可以从我的查询中使用解决方法
$this->getAdapter()
->select()
->from(array('p' => 'productos'))
->joinLeft(array('trans' => $this->getAdapter()
->select()
->from('transferencias', 'SUM(cantidad)')
->where('upc IN (?)', $this->getAdapter()
->select()
->from('productos', 'upc')
)->where('sucursal = ?', 10)
), 'trans.upc = p.upc')
->where('trans.sucursal_clave_destino = ?', 10)
->query()
->fetchAll();
答案 1 :(得分:0)
首先,我担心您的查询无法运行,因为语法错误。写它的正确方法是:
SELECT *, SUM(trans.cantidad) as cantidad
FROM productos AS p
LEFT JOIN transferencias AS trans
ON p.upc = trans.upc
WHERE trans.sucursal_clave_destino = 10 AND trans.sucursal = 10
第一种方法
我假设您已经以这种方式创建了模型:http://framework.zend.com/manual/1.12/en/learning.quickstart.create-model.html
例如,在Default_Model_ProductosMapper:
中function getXXXX(){
$select = "[THE ABOVE QUERY]";
$result = $this->getDbTable()->getAdapter()->fetchAll($select);
return $result;
}
这是最基本的方法。
第二种方法
使用Zend_Db函数,这就像数据库概念中的prepare语句一样。如果从用户输入传递参数,请仅使用它来增加安全性(参见SQL injection),否则使用第一种方法是安全的。
仍然,在你的映射器中:
function getXXXX(){
$query = $this->getDbTable()->getAdapter()->select();
$query->from('productos', array());
$query->joinLeft('transferencias', 'productos.upc = transferencias.upc', array('SUM(trans.cantidad) as cantidad));
$query->where("trans.sucursal_clave_destino = 10");
$query->where("trans.sucursal = 10");
// get result
$stmt = $this->getDbTable()->getAdapter()->query($query);
$result = $stmt->fetchAll();
return $result;
}
第三种方法
如果您使用的是Doctrine2之类的数据库ORM,您还可以编写SQL或DQL(Doctrine查询语言)查询,这些查询语法与SQL查询非常相似,但绝对不是相同的机制。该文件是here。本文档介绍了DQL的上述两种方法,并将告诉您将它们放在何处。