如何使用Doctrine2中的查询构建器更新多个字段?

时间:2016-01-28 06:57:26

标签: php doctrine-orm doctrine query-builder

当我尝试使用外键id使用getRepository()和findOneById将bug作为无法识别的字段更新其他表中的字段时,我必须更新多个字段,因此后来尝试使用查询构建器实现它。但查询不会执行获取未定义字段等错误。

这是我尝试过的代码:

$this->em->getRepository('Application_Entity_Company', 'c')->findOneBy(array('c.userId'=>$post['user_id']));

$qb->update('Application_Entity_Company', 'c')->set('c.name', $post['name'])->set('c.mobile', $post['mobile'])->set('c.email', $post['email'])->where($qb->expr()->eq('c.userId', ':id'))->setParameter('id', $post['user_id'])->getQuery()->execute();

这里userId是外键。我必须使用userId更新用户实体中的用户详细信息字段。

请帮帮我,谢谢你。

1 个答案:

答案 0 :(得分:1)

问题在于set方法的使用不明显。第二个参数应该是表达式而不是明显的用户输入。

对于错误使用的set代码示例:

$queryBuilder = $entityManager->getRepository()->createQueryBuilder('u');
$queryBuilder->update()
    ->set('u.userFirstName', 'Michael')
    ->where('u.userId = :userId')
    ->setParameter('userId', 111)
    ->getQuery()
    ->execute();

SQL表示:

UPDATE user SET user_first_name = Michael WHERE user_id = 111;

您将收到以下错误:

  

[语义错误]第0行,第49行靠近' Michael WHERE':错误:   '迈克尔'没有定义。

这是因为您的数据库假定Michael是表列名,由于显而易见的原因未定义。

解决方案是使用\Doctrine\ORM\Query\Expr或绑定参数:

$queryBuilder = $mapper->getRepository()->createQueryBuilder('u');
$queryBuilder->update()
    ->set('u.userFirstName', ':userFirstName')// Alternatively $queryBuilder->expr()->literal('Michael')
    ->where('u.userId = :userId')
    ->setParameter('userId', 111)
    ->setParameter('userFirstName', 'Michael')
    ->getQuery()
    ->execute();