php 原则2:使用查询生成器更新查询

ru9i0ody  于 2023-05-05  发布在  PHP
关注(0)|答案(4)|浏览(179)

你好,我有以下查询,但它似乎不工作。

$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();

这将返回以下错误消息:
致命错误:未捕获的异常“Doctrine\ORM\Query\QueryException”,消息为“[Semantical Error] line 0,col 38 near 'testusername WHERE':错误:“testusername”未定义。“在...
我会很高兴任何帮助

brqmpdu1

brqmpdu11#

我认为你需要使用->set(),让你所有的值都成为参数会安全得多:

$queryBuilder = $this->em->createQueryBuilder();
$query = $queryBuilder->update('models\User', 'u')
        ->set('u.username', ':userName')
        ->set('u.email', ':email')
        ->where('u.id = :editId')
        ->setParameter('userName', $userName)
        ->setParameter('email', $email)
        ->setParameter('editId', $editId)
        ->getQuery();
$result = $query->execute();
g6ll5ycj

g6ll5ycj2#

假设有一个管理员 Jmeter 板,其中列出了用户,并将其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 — 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之上) 的工作示例。

ogq8wdun

ogq8wdun3#

只要稍加改动,对我来说效果很好

$qb=$this->dm->createQueryBuilder('AppBundle:CSSDInstrument')
               ->update()
               ->field('status')->set($status)
               ->field('id')->equals($instrumentId)
               ->getQuery()
               ->execute();
z4iuyo4d

z4iuyo4d4#

如果要在存储库中编写代码,
则不需要指定实体名称,
只需别名u即可

$query = $this->createQueryBuilder('u')
        ->update()
        ->set('u.username', ':userName')
        ->set('u.email', ':email')
        ->where('u.id = :editId')
        ->setParameter('userName', $userName)
        ->setParameter('email', $email)
        ->setParameter('editId', $editId)
        ->getQuery()
        ->execute();

相关问题