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


74

嗨,我有以下查询,但似乎无法正常工作。

$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',消息为[[语义错误]第0行,列38位于'testusername WHERE'附近:错误:'testusername'未定义。在...

我会很高兴的

Answers:


148

我认为你需要使用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();

6
您应该始终将变量作为参数传递给Doctrine查询!
Pi Wi

7
您也可以use $qb->update(…)->set('u.username', $qb->createNamedParameter($username))省略-> setParameter部分。那是IMO最好的方法。相似的方法是-> createPositionalParameter()。见doctrine-dbal.readthedocs.org/en/latest/reference/...
阿德里安Föder

8

假设有一个管理员仪表板,其中列出了用户,并将其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之上)


4

进行少量更改,对我来说效果很好

$qb=$this->dm->createQueryBuilder('AppBundle:CSSDInstrument')
               ->update()
               ->field('status')->set($status)
               ->field('id')->equals($instrumentId)
               ->getQuery()
               ->execute();
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.