php - Symfony2 在 UPDATE 查询后获得新值

标签 php symfony doctrine-orm

在我的 Symfony2.8 应用程序中,我得到了以下 Controller :

public function changetariffAction(Request $request)
{
    $em = $this->getDoctrine()->getManager();
    $user = $this->container->get('security.context')->getToken()->getUser();
    $userid = $user->getId();
    $tariff = $user->getTariff();//tariff1 here

    $paymentForm = $this->createPaymentForm($user);
    $paymentForm->handleRequest($request);

    if($tariff != 'tariff2') {

        $query = $em->createQuery('UPDATE My\UserBundle\Entity\User u SET u.tariff = :tariff2 WHERE u.id = :userid');
        $query->setParameter('userid', $user->getId());
        $query->setParameter('tariff2', 'tariff2');
        $query = $query->getResult();//returns 1 here, tariff field in DB is set to tariff2 as expected

        $query = $em->createQuery('SELECT u FROM My\UserBundle\Entity\User u WHERE u.id = :userid');//getting once again user entity but it did not change
        $query->setParameter('userid', $user->getId());
        $user = $query->getResult();

        $tariff_upd = $user[0]->getTariff();//tariff1 here but I need tariff2! 
//Also I tried to persist and flush user entity here but it did not work
        return $this->render('MyBundle:Pages:tariffchangesuccess.html.twig', array(
        'user' => $user,
        'form' => $paymentForm->createView(),
        'tariff' => $tariff_upd //still tariff1 but I need tariff2 
    ));

    }
    return $this->render('MyBundle:Pages:tariffchangesuccess.html.twig', array(
        'user' => $user,
        'form' => $paymentForm->createView(),
        'tariff' => $tariff
        ));

}

我的 Controller 工作正常,所有值都按预期在我的数据库中更新,但新值(tariff2)未在我的 Twig 模板中呈现。仅当我在浏览器中更新页面(按 F5)时才会呈现新值,但这不是预期的行为。有什么想法如何解决这个问题吗?谢谢。

最佳答案

Doctrine 使用类似于缓存的东西,也许您使用查询而不是 native 方法会使这个系统短路。 Docrtine 可以处理您的实体并知道要记录什么以及已更改什么等。但是您必须为此使用 Doctrine 函数或存储库,而不是通过自定义查询来完成... Doctrine 方式应该类似于:

$em = $this->getDoctrine()->getManager();
$userid = $this->container->get('security.context')->getToken()->getUser()->getId()
// Get object user from DB values
$user = $em->getRepository('My\UserBundle:User')->findOneById($userid );
// Update tarif in the user object
$user->setTariff('tariff2');
// Let Doctrine write in the DB. The persist() may not be necesary as Doctrine already manage this object, but it's a good practise.
$em->persist($user);
$em-> flush();
// Doctrine should already have update the $user object, but if you really really want to be sure, you can reload it:
$user = $em->getRepository('My\UserBundle:User')->findOneById($userid );

关于php - Symfony2 在 UPDATE 查询后获得新值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39691163/

相关文章:

php - 如何转储 SoapClient 请求进行调试?

php - Mysql连接2个表并合并2个列,但删除重复项

symfony - 如何在 Symfony2 中设置 Twig 模板的默认日期格式?

php - 如何检查未登录用户是否具有角色?

mysql - 实体未坚持原则 2 中的一个值

php - 尽管至少需要一行,但未找到查询结果

php - 如何在原则 2 中添加约束 `on-update-cascade`

php - SQL : Order two tables by Names

php - 您如何调试 CodeIgniter 应用程序?

php - 使用原则保存多条记录并获取每条记录的 ID