从Select Zend Framework左连接

时间:2014-04-30 20:33:57

标签: mysql zend-framework select frameworks left-join

如何使用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 

提前谢谢。

2 个答案:

答案 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的上述两种方法,并将告诉您将它们放在何处。