使用SUM的ZF2自定义数据库查询

时间:2012-11-28 13:08:16

标签: php mysql zend-framework2

有人能给我一个暗示我做错了吗?

public function getPaymentSumByTypeAndProject($project_id,$type) {
  $type = (int) $type;
  $project_id = (int) $project_id;
  $rowset = $this->tableGateway->select(array('total_amount' => new Expression('SUM(payment.amount)')))->where(array('type' => $type, 'project_id' => $project_id));
  $row = $rowset->toArray();
  if (!$row) {
    throw new \Exception("Busted :/");
  }
  return $rowset;
}

我想做同样的查询:

SELECT SUM(amount) FROM payment WHERE type='$type' AND project_id ='$project_id';

编辑: 我取得了很小的进展,我已经想出如何总结整列

public function getPaymentSumByTypeAndProject($project_id, $type) {
    $type = (int) $type;
    $project_id = (int) $project_id;
    $resultSet = $this->tableGateway->select(function (Select $select) {
                $select->columns(array(new \Zend\Db\Sql\Expression('SUM(amount) as amount')))->where('type="0"');
            });
    return $resultSet;

也许有人可以帮我弄清楚如何添加条件:“WHERE type ='$ type'AND project_id ='$ project_id'”?

4 个答案:

答案 0 :(得分:4)

我知道这是一个老问题,但我偶然发现它并认为我会投入两分钱:

public function getPaymentSumByTypeAndProject($project_id, $type) {
    // This TableGateway is already setup for the table 'payment'
    // So we can skip the ->from('payment')
    $sql = $this->tableGateway->getSql();

    // We'll follow the regular order of SQL ( SELECT, FROM, WHERE )
    // So the query is easier to understand
    $select = $sql->select()
            // Use an alias as key in the columns array instead of
            // in the expression itself
            ->columns(array('amount' => new \Zend\Db\Sql\Expression('SUM(amount)')))
            // Type casting the variables as integer can take place
            // here ( it even tells us a little about the table structure )
            ->where(array('type' => (int)$type, 'project_id' => (int)$project_id));

    // Use selectWith as a shortcut to get a resultSet for the above select
    return $this->tableGateway->selectWith($select);
}

此外,可以从表格网关中检索适配器,如下所示:

$adapter = $this->tableGateway->getAdapter();

但是当你选择使用上述方法时,你不再需要它了。

答案 1 :(得分:2)

好了,现在这个有用,告诉我这是怎么回事; s应该做什么?

   public function getPaymentSumByTypeAndProject($project_id, $type) {
        $type = (int) $type;
        $project_id = (int) $project_id;
        $adapter = $this->tableGateway->adapter;
        $sql = new Sql($adapter);
        $select = $sql->select();
        $select->from('payment');
        $select->where(array('type'=>$type,'project_id'=>$project_id));
        $select->columns(array(new \Zend\Db\Sql\Expression('SUM(amount) as amount')));
        $selectString = $sql->getSqlStringForSqlObject($select);
        $resultSet = $adapter->query($selectString, $adapter::QUERY_MODE_EXECUTE);
        return $resultSet;
    }

答案 2 :(得分:1)

使用这个

  $select = $this->getSql()->select()
       ->columns(array('amount' => new \Zend\Db\Sql\Expression('SUM(amount)')))
       ->where("type ='$type'")
       ->where("project_id ='$project_id'");
    $resultSet = $this->selectWith($select);
    $row = $resultSet->current();   
    // echo $select->getSqlString();die; //check query use this line
    if(!$row){
        return False;
    }
    return $row->amount;

答案 3 :(得分:0)

尝试制作类似于(int) $type

的内容
 intval($type);

  intval($project_id);

并在你的SQL中 将变量更改为

   '".$type."' 

AND

  '".$project_id."'