经过几次调试后,我遇到了一个问题我无法找到答案。 基本上,我正在做一个UPDATE语句,然后是同一个表上的SELECT语句。 似乎当SELECT发生时,UPDATE没有完成,因为我得到旧的值。
为什么更新没有完成,以及如何让它在select之前等待?
以下是两个陈述
更新
$stmt = $this->getDoctrine()->getManager()->getConnection()
->prepare('UPDATE Event
SET `begin` = :startTo, `end` = :endTo
WHERE ' . $field .' = :' . $field);
$stmt->bindValue('startTo', $startTo);
$stmt->bindValue('endTo', $endTo);
$stmt->bindValue($field, $elem);
$stmt->execute();
$em->flush();
选择
$qb = $em->getRepository('EntOrganizationBundle:Event')->createQueryBuilder('e');
$qb->where('(e.begin BETWEEN :start AND :end
OR e.end BETWEEN :start AND :end
OR e.begin <= :start AND e.end >= :end)')
->andWhere('e.template = 0')
->andWhere('e.break = 1')
->setparameter(':start', $start)
->setparameter(':end', $end);
$events = $qb->getQuery()->getResult();
这是因为我同时使用查询构建器和原始SQL吗?
谢谢,
答案 0 :(得分:1)
感谢adhocgeek我解决了我的问题。 这是一个缓存问题。
使用原始SQL和QueryBuilder似乎并不是一个好主意,由于缓存,QueryBuilder并不知道原始SQL所做的更改。
我刚在QueryBuilder之前做过$em->clear();
。
答案 1 :(得分:0)
来自here:
Doctrine 2已经为您完成了正确的事务划分:所有写操作(INSERT / UPDATE / DELETE)都排队,直到调用EntityManager#flush(),它在单个事务中包装所有这些更改
因此,在您提交查询之前,您需要flush
或commit
更新。