Php 条令和符号2:如何执行原始查询(一般错误:2014无法执行查询,而>;其他未缓冲查询处于活动状态)

Php 条令和符号2:如何执行原始查询(一般错误:2014无法执行查询,而>;其他未缓冲查询处于活动状态),php,mysql,symfony,doctrine-orm,Php,Mysql,Symfony,Doctrine Orm,我试图在Symfony框架中使用条令执行一个原始查询 下面是代码: class MessagesHandler { /** @var \Doctrine\Common\Persistence\ObjectManager The entity manager used to access entities */ protected $em = null; public function __construct($em) { $this->em

我试图在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无法在 其他未缓冲查询处于活动状态。考虑使用 PDO语句::fetchAll()。或者,如果您的代码只是 要在mysql上运行,可以通过设置 PDO::MYSQL\u ATTR\u USE\u BUFFERED\u查询属性。“)


如何使用
PDOStatement::fetchAll()
使用
createNativeQuery
方法:

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

$count = $query->getResult();

此处提供的文档:

由于建议的解决方案对我来说太复杂了,我继续寻找更简单的解决方案,我提出了以下建议:

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);
}

Inpiration form.

在调用查询之前,是否可以尝试调用$em->getConnection()->fetchAll()或$em->flush?转储结果以查看它是否是您可能正在获取的重要数据,以及您是否希望保留在某个位置。您是否可以使用
em->flush()
缺少某个地方?在我看来,仅仅执行计数查询似乎有点复杂,不是吗?有没有更简单的方法来实现相同的结果?我只需要一个简单的计数。如果你这样做,
$query->getSingleScalarResult()
您可以直接在
$count
变量中获取数字。我不明白为什么这很复杂?我执行与您相同的查询,但我使用参数化查询(以防止sql注入)。您使用了$rsm变量,这是我必须创建的新类,还是没有?感谢您提供有关getSingleScalarResult()的建议!@Aerendir请阅读文档。您应该使用结果映射,即
$rsm