17

有没有办法在 Zend Framework 2 中将 SQL 字符串作为查询执行?

我有一个这样的字符串:

$sql = "SELECT * FROM testTable WHERE myColumn = 5"

现在我想直接执行这个字符串。

4

4 回答 4

55

只需将 sql 字符串传递给您的数据库适配器,如下所示:

$resultSet = $adapter->query($sql, \Zend\Db\Adapter\Adapter::QUERY_MODE_EXECUTE);

如果你想传递参数:

$sql = "SELECT * FROM testTable WHERE myColumn = ?";
$resultSet = $adapter->query($sql, array(5));

编辑:请注意,查询方法并不总是返回结果集。当它的结果集产生 query( SELECT) 时,它返回一个\Zend\Db\ResultSet\ResultSetelse( INSERT, UPDATE, DELETE, ...) 它将返回一个\Zend\Db\Adapter\Driver\ResultInterface.

当你将第二个参数留空时,你会得到一个\Zend\Db\Adapter\Driver\StatementInterface你可以执行的。

于 2013-03-11T07:39:30.450 回答
7
use Zend\Db\Sql\Sql;
use Zend\Db\Adapter\Adapter;

$dbAdapterConfig = array(
    'driver'   => 'Mysqli',
    'database' => 'dbname',
    'username' => 'dbusername',
    'password' => 'dbuserpassword'
);
$dbAdapter = new Adapter($dbAdapterConfig);

$sql = new Sql($dbAdapter);
$select = $sql->select();
$select->from('testTable');
$select->where(array('myColumn' => 5));

$statement = $sql->prepareStatementForSqlObject($select);
$result = $statement->execute();

S. 文档:Zend\DbZend\Db\Sql

于 2013-03-11T08:26:52.863 回答
4

如果您使用的是 tableGateway,则可以使用此语句运行原始 SQL 查询,

$this->tableGateway->getAdapter()->driver->getConnection()->execute($sql);

其中 $sql 与您的原始查询有关。这对于没有本机 ZF2 对应项(如 TRUNCATE / INSERT SELECT 语句)的查询很有用。

于 2015-03-28T10:27:15.900 回答
1

如果你EntityManager手上有 $em,你可以这样做:

   $select = $em->getConnection()->executeQuery("
        SELECT a.id, a.title, a.announcement, asvc.service_id, COUNT(*) AS cnt,
            GROUP_CONCAT(asvc.service_id SEPARATOR \", \") AS svc_ids
        FROM article AS a
        JOIN articles_services AS asvc ON asvc.article_id = a.id
        WHERE
        asvc.service_id IN (
            SELECT tsvc.service_id
            FROM tender AS t
            JOIN tenders_services AS tsvc ON tsvc.tender_id = t.id
            WHERE t.id = :tenderId
        )
        GROUP BY a.id
        ORDER BY cnt DESC, a.id DESC
        LIMIT :articlesCount
    ", [
        'articlesCount' => 5,
        'tenderId' => $tenderId,
    ], [
        'articlesCount' => \PDO::PARAM_INT,
    ]);

    $result = $select->fetchAll(); // <-- here are array of wanted rows

我认为这种执行复杂查询的方式最适合 Zend。但可能我在 Zend 中还不是很聪明。很高兴看到它是否对某人有帮助。

于 2017-02-08T09:47:30.663 回答