Php 条令和符号2:如何执行原始查询(一般错误:2014无法执行查询,而>;其他未缓冲查询处于活动状态)
我试图在Symfony框架中使用条令执行一个原始查询 下面是代码: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
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