【问题标题】:Doctrine and Symfony2: How to execute raw queries (General error: 2014 Cannot execute queries while > other unbuffered queries are active)Doctrine and Symfony2: How to execute raw queries (General error: 2014 Cannot execute queries while > other unbuffered queries are active)
【发布时间】:2015-06-23 13:00:46
【问题描述】:

我正在尝试使用 Doctrine 在 Symfony 框架中执行原始查询。

这里有代码:

class MessagesHandler
{
    /** @var \Doctrine\Common\Persistence\ObjectManager The entity manager used to access entities */
    protected $em = null;

    public function __construct($em)
    {
        $this->em = $em;
    }

    public function getMessagesToPost($user)
    {
        $query = 'SELECT COUNT(*) FROM `messages` WHERE `posted_by` = ' . $user->getId() . ' AND `message_posted` = 0';

        return $this->em->getConnection()->exec($query);
    }

我已将 MessagesHandler 类设置为服务:

services:
    shq.handler.Messages:
                class: AppBundle\Handler\MessagesHandler
                arguments: ["@doctrine.orm.entity_manager"]

现在,当我执行代码时,我收到以下错误:

SQLSTATE[HY000]:一般错误:2014 无法执行查询,而 其他无缓冲查询处于活动状态。考虑使用 PDOStatement::fetchAll()。或者,如果您的代码只是 要针对 mysql 运行,您可以通过设置启用查询缓冲 PDO::MYSQL_ATTR_USE_BUFFERED_QUERY 属性。")...

如何使用PDOStatement::fetchAll()

【问题讨论】:

  • 您可以在调用查询之前尝试调用 $em->getConnection()->fetchAll() 或 $em->flush 吗?转储结果以查看它是否是您可能正在获取的重要数据以及您想要保留在某处的数据。
  • 你能不能在某处丢失em->flush()

标签: php mysql symfony doctrine-orm


【解决方案1】:

使用createNativeQuery 方法:

$query = $entityManager->createNativeQuery('SELECT COUNT(*) FROM `messages` WHERE `posted_by` = ? AND `message_posted` = 0', $rsm);
$query->setParameter(1, $user->getId());

$count = $query->getResult();

此处提供文档:http://doctrine-orm.readthedocs.org/en/latest/reference/native-sql.html

【讨论】:

  • 执行计数查询在我看来有点复杂,不是吗?有没有更简单的方法来达到同样的效果?我只想要一个简单的计数。
  • 如果您使用$query->getSingleScalarResult(),您将直接在$count 变量中获得数字。我不明白为什么这很复杂?我执行与您相同的查询,但我使用参数化查询(以防止 sql 注入)。
  • 你使用了我必须创建的新类 $rsm 变量吗?
  • 感谢您对 getSingleScalarResult() 的建议!
  • @Aerendir 请阅读文档。您应该使用结果映射,即$rsm
【解决方案2】:

由于建议的解决方案对我来说似乎太复杂了,我继续寻找更简单的解决方案并想出了这个:

public function getMessagesToPost($user)
{
    $query = 'SELECT COUNT(*) FROM `messages` WHERE `posted_by` = :userId AND `message_posted` = 0';

    $params = array(
        'userId' => $user->getId()
        );

    /** @var \Doctrine\DBAL\Statement $preparedQuery */
    $preparedQuery = $this->em->getConnection()->prepare($query);
    $preparedQuery->execute($params);

    $result = $preparedQuery->fetch();

    // Return the first value of the returned array
    return array_shift($result);
}

灵感表单here.

【讨论】:

    猜你喜欢
    • 2022-12-02
    • 1970-01-01
    • 2022-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-14
    • 2022-12-27
    • 1970-01-01
    相关资源
    最近更新 更多