学说2:用查询生成器更新查询

嗨,我有以下查询,但似乎并没有工作。

$q = $this->em->createQueryBuilder() ->update('models\User', 'u') ->set('u.username', $username) ->set('u.email', $email) ->where('u.id = ?1') ->setParameter(1, $editId) ->getQuery(); $p = $q->execute(); 

这将返回以下错误消息:

致命错误:未知的exception'Doctrine \ ORM \ Query \ QueryException'与消息'[语义错误]行0,col 38附近'testusername WHERE':错误:'testusername'未定义'。 在……

我会很高兴有任何帮助

我想你需要使用Expr ->set()

 $qb = $this->em->createQueryBuilder(); $q = $qb->update('models\User', 'u') ->set('u.username', $qb->expr()->literal($username)) ->set('u.email', $qb->expr()->literal($email)) ->where('u.id = ?1') ->setParameter(1, $editId) ->getQuery(); $p = $q->execute(); 

要么,要么使所有的值参数:

 $qb = $this->em->createQueryBuilder(); $q = $qb->update('models\User', 'u') ->set('u.username', '?1') ->set('u.email', '?2') ->where('u.id = ?3') ->setParameter(1, $username) ->setParameter(2, $email) ->setParameter(3, $editId) ->getQuery(); $p = $q->execute(); 

假设您有一些后端显示用户列表(可由less数pipe理员访问,可能对用户详细信息具有读取/写入权限)
在那里你可以在自己的行上打印用户id作为数据属性,以便在Javascript中检索它,而某些事件被触发。

然后更新可以这样执行…

 class UserRepository extends \Doctrine\ORM\EntityRepository { public function updateUserStatus($userId, $newStatus) { return $this->createQueryBuilder('u') ->update() ->set('u.isActive', '?1') ->setParameter(1, $qb->expr()->literal($newStatus)) ->where('u.id = ?2') ->setParameter(2, $qb->expr()->literal($userId)) ->getQuery()->getSingleScalarResult(); } 

(ajax)处理操作中

  # Post datas may be handled with a specific custom formType # … OR … # Directly retrieved from request object $userId = (int)$request->request->get('userId'); $newStatus = (int)$request->request->get('newStatus'); $em = $this->getDoctrine()->getManager(); $r = $em->getRepository('NAMESPACE\User') ->updateUserStatus($userId, $newStatus); if ( !empty($r) ){ # Row updated } # … 

使用Doctrine 2.5的工作示例(在Symfony3之上)