Zend framework2 如何在ZF2的tableGateway中使用having()

Zend framework2 如何在ZF2的tableGateway中使用having(),zend-framework2,Zend Framework2,如何在ZF2中使用having()子句 网上几乎没有关于如何准备正确的选择对象的例子 我有如下疑问: SELECT root_schema_id as `schema_id` FROM `standard_specific_root_schemas` WHERE `vehicle_id` IN (".implode(",",$vehiclesIds).") GROUP BY `schema_id`, rootSubGroup_id HAVING count(*)=".$noOfVehicles

如何在ZF2中使用having()子句

网上几乎没有关于如何准备正确的选择对象的例子

我有如下疑问:

SELECT root_schema_id as `schema_id`
FROM `standard_specific_root_schemas`
WHERE `vehicle_id` IN (".implode(",",$vehiclesIds).")
GROUP BY `schema_id`, rootSubGroup_id HAVING count(*)=".$noOfVehicles
我尝试在ZF2中运行它:

public function getVehicleWithinCommonRootSubgroupInSpecific($vehiclesIds)
{
    $where = new Where();
    $where->in('vehicle_id', $vehiclesIds);

    $having = new Having('count(*) = '.count($vehiclesIds));

    $rowset = $this->tableGateway->select(function (Select $select) use ($where, $having) {
        $select
            ->where($where)
            ->having($having);
    });

    if (!$rowset) {
        throw new \Exception("Could not find schemas for group $groupId");
    }
    return $rowset;
}
当然,ZF2中的那个部分还没有完成,因为我想先检查它是否工作。 我尝试了几种为have方法提供参数的方法,但每种方法都会产生错误


请帮帮我,我很绝望

我无法测试您的查询,但可以尝试重新生成您需要的查询

我通过构造调整了必须使用->expression()而不是变量。 我还添加了集团声明

为了查看查询,我添加了一个var_转储:

    $where = new \Zend\Db\Sql\Where();
    $where->in('vehicle_id', $vehiclesIds);

    $having = new \Zend\Db\Sql\Having();
    $having->expression('count(*) = ?', count($vehiclesIds));

    $rowset = $this->tableGateway->select(function (\Zend\Db\Sql\Select $select) use ($where, $having) {
        $select
            ->where($where)
            ->group(array('schema_id', 'rootSubGroup_id'))
            ->having($having);

        var_dump( $select->getSqlString() );
    });
让我知道这是否有帮助


要避免评论中提到的错误,您必须执行以下操作:

$sql = $this->tableGateway->getSql();

$select = $sql->select();

$where = new \Zend\Db\Sql\Where();
$where->in('vehicle_id', $vehiclesIds);

$having = new \Zend\Db\Sql\Having();
$having->expression('count(*) = ?', count($vehiclesIds));

$select
    ->where($where)
    ->group(array('schema_id', 'rootSubGroup_id'))
    ->having($having);

$preparedQuery = $sql->prepareStatementForSqlObject($select);

var_dump( $preparedQuery->getSql() );
但是,如果我是对的,tableGateway会为您执行此操作,因此一旦您开始使用select查询数据库,错误就会消失

此外,您也可以使用上面的方法来完成此操作,只需替换此项:

$preparedQuery = $sql->prepareStatementForSqlObject($select);

var_dump( $preparedQuery->getSql() );
与:


谢谢,它工作正常。似乎我不久前也遇到过类似的问题,但我忽略了它,因为我遇到了以下错误:
在没有特定驱动程序级别支持的情况下尝试引用值可能会在生产环境中引入安全漏洞。在第80行的\vendor\zendframework\zendframework\library\Zend\Db\Adapter\Platform\Sql92.php中
。无论如何,生成的SQL是可以的。谢谢你这么做。使用
$sql->prepareStatementForSqlObject($select)应该去掉它。不客气,谢谢你的回复!这里有什么用法吗?如何在这里获取$sql对象?实际结果不需要它,但是,我已经用一种方法更新了我的答案。非常适合我!谢谢我还添加了
->列(数组('schema_id'=>'root_schema_id'))
,以使SQL完全相同并允许正确分组。需要将
->列(数组('schema_id'=>'root_schema_id')
添加到
$select
以选择正确的列进行分组。(请参见下面的评论。)
$this->tableGateway->selectWith($select);