当我尝试使用外键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更新用户实体中的用户详细信息字段。
请帮帮我,谢谢你。
答案 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();